Что такое параметр _snowman в Ruby on Rails 3?

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

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

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

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

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

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

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