Для чего является _snowman параметрический усилитель в Ruby on Rails 3 формами?

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

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

173
задан 4 revs, 3 users 60% 1 January 2013 в 12:26
поделиться

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.
  • Вы можете спокойно игнорировать params[:_snowman]

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

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

55
ответ дан 23 November 2019 в 20:36
поделиться

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

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

Это означает, что если пользователь выполняет поиск по запросу «Че Гевара», он будет неправильно отображаться на стороне сервера. В Ruby 1.9 это приведет к ошибке кодирования, когда текст неизбежно попадет в обработчик регулярных выражений. В Ruby 1.8 это приведет к неверным результатам для пользователя.

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

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

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

305
ответ дан 23 November 2019 в 20:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: