Для чого складається парам _snowman у Ruby on Rails 3?


174

У Ruby on Rails 3 (зараз використовується Beta 4) я бачу, що при використанні form_tagабо form_forhelpers з’являється приховане поле, назване _snowmanзі значенням ☃ ( Unicode \ x9731).

Отже, для чого це?


2
Це "запитання" типу Q&A - я спробував знайти відповідь тут, і в кінцевому підсумку перекопав повідомлення про фіксацію, тому зрозумів, що поділюсь цим іншим, хто цікавиться про сніговика ...
Matthew Savage

Побачте і це .
MasterMastic

Відповіді:


308

Цей параметр було додано до форм, щоб змусити Internet Explorer (5, 6, 7 і 8) кодувати його параметри унікодом.

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

Це означає, що якщо користувач шукає "Ché Guevara", він буде неправильно переходити на сторону сервера. У Ruby 1.9 це призведе до помилки кодування, коли текст неминуче пробивається в механізм регулярних виразів. У Ruby 1.8 це призведе до неполадок для користувача.

Створюючи параметр, який може бути зрозумілий тільки IE як символ unicode, ми змушуємо IE дивитися на атрибут accept-charset, який потім повідомляє йому кодувати всі символи як UTF-8, навіть ті, які можна закодувати. латинською-1.

Майте на увазі, що в Ruby 1.8 вкрай тривіально отримувати дані Latin-1 у вашу базу даних UTF-8 (оскільки ніщо у цілому стеку не перевіряє, що байти, надіслані користувачем у будь-який момент, є дійсними символами UTF-8). Як результат, в програмах Ruby (і PHP-програмах тощо, тощо) надзвичайно часто виявляти цю помилку, орієнтовану на користувачів, і тому надзвичайно часто користувачі намагаються змінити кодування як паліативну міру.

Все, що було сказано, коли я писав цей патч, я не розумів, що ім'я параметра коли-небудь з’явиться в обраному користувачем місці (це стосується форм, які використовують дію GET, наприклад, форми пошуку). Оскільки це так, ми перейменовуємо цей параметр у _eта використовуватимемо більш нешкідливий зовнішній символ символу.


1
Якщо це закінчить прозорий параметр, як _method, він, ймовірно, буде набагато менш заплутаним. Що за божевільна річ, що потрібно виправити.
тадман

1
Дякую за детальну відповідь, Єгуда - хоча я думаю, що утримати сніговика найкращий результат, його, мабуть, одне з тих дурних речей, які «підприємства» виберуть - «що за чорт ця штука?» це бізнес, а не гра! '.. Тьфу.
Меттью Савидж

1
@Matthew, як не дивно, ти маєш рацію. Але я відчуваю, що рішення досить вражаюче.
JP Silvashy

10
З цього часу сніговика замінено на прихований вхід з ім'ям utf8 зі значенням, встановленим на "& # x2713". Я використовую form_tag для мого перемикача мови і почав отримувати безліч винятків, оскільки один сканер має проблеми з цим значенням і неправильно з'єднує параметр utf8 та його значення зі значенням параметра вибору у формі.
Крістер Фернстром

56

Це тут, щоб підтримувати Internet Explorer 5 та заохочувати його використовувати UTF-8 для своїх форм.

Повідомлення про фіксацію, яке ви бачите тут, докладно описує наступне:

Виправте кілька відомих проблем веб-кодування:

  • Укажіть акцепт-схему на всіх формах. Усі останні браузери, а також 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.


7
У цитаті написано "IE5 +", тож, можливо, проблема виникає і в нових версіях IE?
Філіпп

5
Для більш тривалої відповіді, будь ласка, подивіться на github.com/rails/rails/commit/… (також дивіться мою відповідь нижче)
Yehuda Katz
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.