Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

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

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 タグを作っているのはここ

# 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

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

module ActionView
  module Helpers
    module FormTagHelper
      def utf8_enforcer_tag

特定の 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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Help us understand the problem. What are the problem?