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

174

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

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

Peter Mortensen
источник
2
Это вопросы и ответы типа «документация» - я попытался найти ответ здесь, и в итоге я перебрал сообщения коммита, поэтому я решил поделиться им здесь с другими, кто интересуется снеговиком ...
Мэтью Сэвидж
Также посмотрите это .
MasterMastic

Ответы:

308

Этот параметр был добавлен в формы для того, чтобы заставить 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и использовать более безвредно выглядящий символ Юникода.

Yehuda Katz
источник
1
Если это приведет к появлению прозрачного параметра, такого как _method, это, вероятно, будет намного менее запутанным. Что за сумасшедшая вещь, чтобы исправить, хотя
Тадман
1
Спасибо за подробный ответ Yehuda - хотя я думаю, что сохранение снеговика - лучший результат, это, вероятно, одна из тех глупых вещей, которые выберут «предприятия» - «что, черт возьми, этот снеговик?!? это бизнес, а не игра! »
Мэтью Сэвидж
1
@ Мэтью, как ни странно, ты прав. Но я чувствую, что решение довольно впечатляющее.
JP Silvashy
10
С тех пор Snowman был заменен скрытым вводом с именем utf8 со значением, установленным в "& # x2713". Я использовал form_tag для моего переключателя языка и начал получать множество исключений, потому что один сканер, похоже, имеет проблемы с этим значением и неправильно объединяет параметр utf8 и его значение со значением параметра выбора в форме.
Кристер Фернстрем
56

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

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

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

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

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

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

Matthew Savage
источник
7
Цитата гласит «IE5 +», так что, возможно, проблема возникает и в более новых версиях IE?
Филипп
5
Для более продолжительного ответа, пожалуйста, посмотрите на github.com/rails/rails/commit/… (также см. Мой ответ ниже)
Иегуда Кац