Rails の `utf8=✓` の歴史と消し方と snowman ☃

  • 86
    いいね
  • 1
    コメント
この記事は最終更新日から1年以上が経過しています。

Rails の form_tag や form_for で form を作成すると <input name="utf8" type="hidden" value="✓"> という input 要素が自動で追加されて、submit すると utf8=✓ というパラメータが付いてくる。これの歴史と消し方を調べた。

歴史

Rails3 で、Internet Explorer 5、6、7、8 にパラメータを Unicode でエンコードさせるため、上記ヘルパーで作成された form に snowman というパラメータがつくようになった。詳しい経緯はコミットログや、snowman を追加した Yehuda Katz 本人による stackoverflow の回答に書いてある。

その当時の rails を使ったことないけど、&#9731 ってこんなのらしいので、 _snowman=☃ って表示されていたんですかね。

Yehuda Katz の回答に書いてあるとおり、_snowman から _e になって、その後 utf8=✓ にするって言ったり、やっぱり _utf8=☃ にするって言ったりしながら、utf8=✓ に落ち着いたらしい。みんな楽しそう。

消し方

すべての form から utf8 を消す場合

utf8 の input タグを作っているのはここ

rails/actionview/lib/action_view/helpers/form_tag_helper.rb
# Creates the hidden UTF8 enforcer tag. Override this method in a helper
# to customize the tag.
def utf8_enforcer_tag
  # Use raw HTML to ensure the value is written as an HTML entity; it
  # needs to be the right character regardless of which encoding the
  # browser infers.
  '<input name="utf8" type="hidden" value="&#x2713;" />'.html_safe
end

コメントに書いてあるとおり、utf8_enforcer_tag を上書きする。

module ActionView
  module Helpers
    module FormTagHelper
      def utf8_enforcer_tag
        ''
      end
    end
  end
end

特定の form から utf8 を消す場合

rails/actionview/lib/action_view/helpers/form_helper.rbrails/actionview/lib/action_view/helpers/form_tag_helper.rb を調べた。

form_for の場合

form_for @model, html: { enforce_utf8: false } do |f|

リファレンス(コメント)には enforce_utf8 オプションに false を渡すと消えると書いてあるけど、正確には html オプション に enforce_utf8: false を含める必要がある。

form_tag の場合

form_tag '/models', enforce_utf8: false do