web-dev-qa-db-ja.com

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

Ruby on Rails 3(現在Beta 4を使用))では、form_tagまたはform_forヘルパーを使用すると、 _( nicode \x9731)の値を持つ_snowmanという名前の非表示フィールドが表示されます。

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

171
Matthew Savage

これはInternetlorExplorer 5をサポートし、フォームに TF-8 を使用することを奨励するためにあります。

表示されるコミットメッセージ here は、次のように詳細を示します。

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

  • すべてのフォームでaccept-charsetを指定します。 IE5 +と同様、最近のすべてのブラウザーは、フォームパラメーターに指定されたエンコーディングを使用します
  • 残念ながら、フォームの値の少なくとも1文字がページの文字セットにない場合を除き、IE5 +はaccept-charsetを参照しません。ユーザーはデフォルトを上書きできるため
    charset(RailsはUTF-8に設定)、Unicode文字を含む隠し入力を提供し、IEにaccept-charsetを強制的に表示させます。
  • Web入力の大部分がUTF-8であるため、インバウンドパラメーターをUTF-8に設定します。これにより、ASCII-8BITと
    UTF-8。
  • Params [:_ snowman]は安全に無視できます

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

それでも、Internet Explorer 5のような古いテクノロジーをサポートしている理由は定かではありません。Railsの決定に関する非常に非Rubyのように思えます。

55
Matthew Savage

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

具体的には、ユーザーがブラウザのエンコーディングをLatin-1に切り替えると、このバグが発生する可能性があります。ユーザーがなぜ一見狂ったようなことをすることにしたのかを理解するには、 this google search をチェックしてください。ユーザーがWebサイトをLatin-1モードにすると、Latin-1とUnicodeの両方として理解できる文字(たとえば、名前に共通のéまたはç)を使用する場合、Internet ExplorerはそれらをLatinでエンコードします-1。

これは、ユーザーが「ChéGuevara」を検索すると、サーバー側で誤って検索されることを意味します。 Ruby 1.9では、テキストが必然的に正規表現エンジンに入ると、エンコードエラーが発生します。 Ruby 1.8では、ユーザーの結果が壊れます。

IEのみがユニコード文字として理解できるパラメーターを作成することで、IEにaccept-charset属性を強制的に調べさせ、すべてのエンコードを指示します文字をUTF-8として、Latin-1でエンコードできるものも。

Ruby 1.8では、Latin-1データをUTF-8データベースに取り込むことは非常に簡単です(nothingスタック全体で、ユーザーが任意の時点で送信したバイトが有効なUTF-8文字であることを確認します)。その結果、Rubyアプリケーション(およびPHPアプリケーションなど)がこのユーザー向けのバグを示すことは非常に一般的であるため、ユーザーが変更しようとすることは非常に一般的です。緩和手段としてのエンコーディング。

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

303
Yehuda Katz