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 を使ったことないけど、☃
ってこんなのらしいので、 _snowman=☃
って表示されていたんですかね。
Yehuda Katz の回答に書いてあるとおり、_snowman から _e になって、その後 utf8=✓ にするって言ったり、やっぱり _utf8=☃ にするって言ったりしながら、utf8=✓ に落ち着いたらしい。みんな楽しそう。
消し方
すべての form から utf8 を消す場合
utf8 の input タグを作っているのはここ。
# 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="✓" />'.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.rb と rails/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