Для чего нужен параметр _snowman в формах Ruby on Rails 3?

В Ruby on Rails 3 (в настоящее время используется бета-версия 4), я вижу, что при использовании form_tag или же form_for помощники есть скрытое поле с именем _snowman со значением ☃ ( Unicode \ x9731), отображаемым.

Итак, для чего это нужно?

2 ответа

Решение

Это здесь для поддержки Internet Explorer 5 и поощрения использования UTF-8 для своих форм.

Сообщение о коммите, показанное здесь, детализирует его следующим образом:

Исправьте несколько известных проблем веб-кодирования:

  • Укажите accept-charset во всех формах. Все последние браузеры, а также IE5+, будут использовать кодировку, указанную для параметров формы
  • К сожалению, IE5+ не будет смотреть на accept-charset, если хотя бы один символ в значениях формы не находится в кодировке страницы. Так как пользователь может переопределить значение по умолчанию
    charset (который Rails устанавливает в UTF-8), мы предоставляем скрытый ввод, содержащий символ юникода, заставляя IE посмотреть на accept-charset.
  • Теперь, когда подавляющее большинство веб-ввода - это UTF-8, мы устанавливаем входящие параметры в UTF-8. Это исключит множество случаев несовместимого кодирования между ASCII-8BIT и
    UTF-8.
  • Вы можете смело игнорировать параметры [:_ снеговик]

Короче говоря, вы можете смело игнорировать этот параметр.

Тем не менее, я не уверен, почему мы поддерживаем старые технологии, такие как Internet Explorer 5. Похоже, это совсем не решение Ruby on Rails, если вы спросите меня.

Этот параметр был добавлен в формы для того, чтобы заставить Internet Explorer (5, 6, 7 и 8) кодировать его параметры как Unicode.

В частности, эта ошибка может быть вызвана, если пользователь переключает кодировку браузера на Latin-1. Чтобы понять, почему пользователь решил сделать что-то сумасшедшее, поищите в этом поиске Google. Когда пользователь переводит веб-сайт в режим Latin-1, если он использует символы, которые можно понимать как Latin-1 и Unicode (например, é или ç, общие по именам), Internet Explorer закодирует их на латинице. -1.

Это означает, что если пользователь ищет "Ché Guevara", он будет некорректно отображаться на стороне сервера. В Ruby 1.9 это приведет к ошибке кодирования, когда текст неизбежно попадет в механизм регулярных выражений. В Ruby 1.8 это приведет к неверным результатам для пользователя.

Создавая параметр, который может восприниматься IE только как символ Юникода, мы заставляем IE посмотреть атрибут accept-charset, который затем говорит ему кодировать все символы как UTF-8, даже те, которые могут быть закодированы. на латыни-1.

Имейте в виду, что в Ruby 1.8 очень просто загружать данные Latin-1 в вашу базу данных UTF-8 (поскольку ничто во всем стеке не проверяет, что байты, отправленные пользователем в любой точке, являются действительными символами UTF-8). В результате этого приложения Ruby (и приложения PHP, и т. Д.) Очень часто демонстрируют эту ошибку, с которой сталкиваются пользователи, и поэтому пользователи очень часто пытаются изменить кодировку как паллиативную меру.

При всем этом, когда я писал этот патч, я не осознавал, что имя параметра будет когда-либо появляться в месте, обращенном к пользователю (это происходит с формами, использующими действие GET, такими как формы поиска). Поскольку это произойдет, мы переименуем этот параметр в _eи используйте более безобидно выглядящий символ юникода.

Другие вопросы по тегам