Posted at

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

More than 3 years have passed since last update.

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