110
100

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

110
100
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
110
100

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?