Ruby on Rails 3フォームの_snowmanパラメータは何のためのものですか?


174

Ruby on Rails 3(現在Beta 4を使用)では、form_tagまたはform_forヘルパーを使用する_snowmanと、when(Unicode \ x9731)の値で名前が付けられた非表示フィールドが表示されることがわかります。

それで、これは何のためですか?


2
これは「ドキュメント」タイプのQ&Aです。ここで答えを見つけようとしたところ、コミットメッセージを掘り下げてしまいました。雪だるまについて不思議に思っている他の人のためにここで共有したいと思いました...
Matthew Savage

参照してくださいこれを
MasterMastic 2013年

回答:


308

このパラメーターは、Internet Explorer(5、6、7、および 8)がパラメーターをUnicodeとしてエンコードするように強制するためにフォームに追加されました。

具体的には、このバグは、ユーザーがブラウザーのエンコードをLatin-1に切り替えた場合にトリガーされます。ユーザーが一見すごいことをする理由を理解するには、このGoogle検索をチェックしてください。ユーザーがWebサイトをLatin-1モードにした後、Latin-1とUnicodeの両方として理解できる文字(たとえば、名前に共通のéまたはç)を使用している場合、Internet Explorerはそれらをラテン語でエンコードします-1。

つまり、ユーザーが "ChéGuevara"を検索すると、サーバー側では正しく検索されません。Ruby 1.9では、テキストが必然的に正規表現エンジンに入ると、エンコーディングエラーが発生します。Ruby 1.8では、ユーザーの結果が壊れます。

IEだけがUnicode文字として理解できるパラメーターを作成することにより、IEにaccept-charset属性を確認するように強制します。これにより、すべての文字をUTF-8としてエンコードするように指示されます。 Latin-1で。

ルビー1.8で、あなたのUTF-8のデータベースにLatin-1のデータを取得することが非常に些細であることに注意してください(以降何もスタック全体のチェックで、ユーザが任意の時点で送信されたことのバイトが有効なUTF-8文字であること)。その結果、Rubyアプリケーション(およびPHPアプリケーションなど)がこのユーザー向けのバグを示すことは非常に一般的です。したがって、緩和策としてユーザーがエンコードを変更しようとすることは非常に一般的です。

そうは言っても、このパッチを作成したとき、パラメーターの名前がユーザーに直接表示される場所に表示されることを理解していませんでした(検索フォームなどのGETアクションを使用するフォームで行われます)。そのため、このパラメーターの名前をに変更し_e、より無害に見えるUnicode文字を使用します。


1
これが_methodのような透過的なパラメーターになる場合は、おそらく混乱がはるかに少なくなります。しかし、修正する必要があるなんてクレイジーなことです。
tadman

1
詳細な回答をありがとうイェフダ-雪だるまを保つことが最良の結果だと思いますが、おそらく「企業」が愚かなことを選ぶでしょう-「この雪だるまは一体何なんだ!?? これはゲームではなくビジネスです!」
Matthew Savage、

1
@マシュー、奇妙なことにあなたは正しい。しかし、私はソリューションがかなり印象的であると感じています。
JP Silvashy 2010

10
Snowmanは、utf8という名前の非表示の入力に置き換えられ、値は「&#x2713」に設定されています。1つのクローラーでこの値に問題があり、utf8パラメーターとその値がフォームの選択オプションの値と誤って連結されているため、言語スイッチャーにform_tagを使用し、多くの例外を取得し始めました。
Christer Fernstrom、2014年

56

これは、Internet Explorer 5をサポートし、フォームにUTF-8を使用することを推奨するためのものです。

ここで見られるコミットメッセージは次のようにそれを詳述します:

いくつかの既知のWebエンコーディングの問題を修正します。

  • すべてのフォームでaccept-charsetを指定します。最近のすべてのブラウザとIE5 +は、フォームパラメータに指定されたエンコーディングを使用します
  • 残念ながら、フォームの値の少なくとも1つの文字がページの文字セットにない場合を除き、IE5 +はaccept-charsetを調べません。ユーザーはデフォルトの
    文字セット(RailsがUTF-8に設定する)をオーバーライドできるため、Unicode文字を含む非表示の入力を提供し、IEにaccept-charsetを確認させる。
  • Web入力の大部分がUTF-8であるため、受信パラメーターをUTF-8に設定します。これにより、ASCII-8BITと
    UTF-8の間で互換性のないエンコーディングの多くのケースが排除されます。
  • params [:_ snowman]は無視しても問題ありません

つまり、このパラメーターは無視しても問題ありません。

それでも、なぜInternet Explorer 5のような古いテクノロジーをサポートしているのかはわかりません。私に尋ねると、Ruby on Railsの決定ではないようです。


7
引用には「IE5 +」と書かれているので、新しいバージョンのIEでも問題が発生するのではないでしょうか。
フィリップ

5
より長い応答については、github.com / rails / rails / commit /を参照してください(また、以下の私の応答を参照してください)
Yehuda Katz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.