Wofür ist der Parameter _snowman in Ruby on Rails 3-Formularen vorgesehen?

174

In Ruby on Rails 3 (derzeit mit Beta 4) wird bei Verwendung von form_tagoder helfer form_forein verstecktes Feld _snowmanmit dem Wert ☃ ( Unicode \ x9731) angezeigt.

Also, wofür ist das?

Peter Mortensen
quelle
2
Dies ist eine Frage und Antwort vom Typ "Dokumentation". Ich habe versucht, hier eine Antwort zu finden, und habe dann die Commit-Nachrichten durchgesehen, sodass ich dachte, ich würde sie hier für andere teilen, die sich über den Schneemann wundern ...
Matthew Savage
Siehe auch dies .
MasterMastic

Antworten:

308

Dieser Parameter wurde Formularen hinzugefügt, um Internet Explorer (5, 6, 7 und 8) zu zwingen, seine Parameter als Unicode zu codieren.

Insbesondere kann dieser Fehler ausgelöst werden, wenn der Benutzer die Codierung des Browsers auf Latin-1 umstellt. Schauen Sie sich diese Google-Suche an , um zu verstehen, warum sich ein Nutzer für etwas so Verrücktes entscheidet . Sobald der Benutzer die Website in den Latin-1-Modus versetzt hat und Zeichen verwendet, die sowohl als Latin-1 als auch als Unicode verstanden werden können (z. B. é oder ç, häufig in Namen), codiert Internet Explorer sie in Latin -1.

Dies bedeutet, dass ein Benutzer, der nach "Ché Guevara" sucht, auf der Serverseite falsch durchkommt. In Ruby 1.9 führt dies zu einem Codierungsfehler, wenn der Text unweigerlich in die Engine für reguläre Ausdrücke gelangt. In Ruby 1.8 führt dies zu fehlerhaften Ergebnissen für den Benutzer.

Indem wir einen Parameter erstellen, der nur vom IE als Unicode-Zeichen verstanden werden kann, zwingen wir den IE, das Attribut accept-charset zu betrachten, das ihn dann anweist, alle Zeichen als UTF-8 zu codieren, auch diejenigen, die codiert werden können in Latein-1.

Beachten Sie, dass es in Ruby 1.8 äußerst trivial ist, Latin-1-Daten in Ihre UTF-8-Datenbank zu übertragen (da nichts im gesamten Stapel überprüft, ob die vom Benutzer zu irgendeinem Zeitpunkt gesendeten Bytes gültige UTF-8-Zeichen sind). Infolgedessen ist es bei Ruby-Anwendungen (und PHP-Anwendungen usw. usw.) äußerst häufig, dass dieser benutzerbezogene Fehler auftritt, und daher ist es äußerst häufig, dass Benutzer versuchen, die Codierung als palliative Maßnahme zu ändern.

Als ich diesen Patch schrieb, war mir nicht klar, dass der Name des Parameters jemals an einer benutzerbezogenen Stelle erscheinen würde (dies gilt für Formulare, die die GET-Aktion verwenden, z. B. Suchformulare). Da dies der Fall ist, werden wir diesen Parameter in umbenennen _eund ein harmlos aussehendes Unicode-Zeichen verwenden.

Yehuda Katz
quelle
1
Wenn dies zu einem transparenten Parameter wie _method führt, ist dies wahrscheinlich weniger verwirrend. Was für eine verrückte Sache, die man reparieren muss.
Tadman
1
Vielen Dank für die ausführliche Antwort Yehuda - obwohl ich denke, dass es das beste Ergebnis ist, den Schneemann zu behalten, ist es wahrscheinlich eines dieser dummen Dinge, die "Unternehmen" aufgreifen werden - "Was zum Teufel ist das für ein Schneemann?!?" Das ist ein Geschäft, kein Spiel! '.. Ugh.
Matthew Savage
1
@ Matthew, seltsamerweise hast du recht. Aber ich finde die Lösung ziemlich beeindruckend.
JP Silvashy
10
Snowman wurde inzwischen durch eine versteckte Eingabe namens utf8 mit dem Wert "& # x2713" ersetzt. Ich verwende ein form_tag für meinen Sprachumschalter und habe viele Ausnahmen erhalten, da ein Crawler Probleme mit diesem Wert zu haben scheint und den Parameter utf8 und seinen Wert fälschlicherweise mit dem Wert einer Auswahloption im Formular verkettet.
Christer Fernstrom
56

Dies dient dazu, Internet Explorer 5 zu unterstützen und es zu ermutigen, UTF-8 für seine Formulare zu verwenden.

In der hier angezeigten Festschreibungsnachricht wird Folgendes beschrieben:

Beheben Sie mehrere bekannte Webcodierungsprobleme:

  • Geben Sie in allen Formularen einen Akzeptanzzeichensatz an. Alle neueren Browser sowie IE5 + verwenden die für Formularparameter angegebene Codierung
  • Leider wird in IE5 + der Akzeptanz-Zeichensatz nur angezeigt, wenn mindestens ein Zeichen in den Werten des Formulars nicht im Zeichensatz der Seite enthalten ist. Da der Benutzer den Standardzeichensatz
    (den Rails auf UTF-8 setzt) überschreiben kann , stellen wir eine versteckte Eingabe bereit, die ein Unicode-Zeichen enthält, wodurch der IE gezwungen wird, den Akzeptanzzeichensatz anzuzeigen.
  • Da die überwiegende Mehrheit der Webeingaben UTF-8 ist, setzen wir die eingehenden Parameter auf UTF-8. Dadurch werden viele Fälle inkompatibler Codierungen zwischen ASCII-8BIT und
    UTF-8 beseitigt .
  • Sie können Parameter [: _ Schneemann] ignorieren

Kurz gesagt, Sie können diesen Parameter ignorieren.

Trotzdem bin ich mir nicht sicher, warum wir alte Technologien wie Internet Explorer 5 unterstützen. Wenn Sie mich fragen, scheint dies eine Entscheidung zu sein, die nicht von Ruby on Rails stammt.

Matthew Savage
quelle
7
Das Zitat lautet "IE5 +". Vielleicht tritt das Problem auch in neueren IE-Versionen auf?
Philipp
5
Eine ausführlichere Antwort finden Sie unter github.com/rails/rails/commit/… (siehe auch meine Antwort unten)
Yehuda Katz