SSブログ

【Rails3.2系開発】form_tagヘルパー利用時に"utf8=なんたら"というパラメータを吐かないようにした事 [rails]

仕事でハマったのでメモがてら。

Railsで"form_tag"ヘルパーを利用してformを作り、パラメータをGETで飛ばすと"?utf8=✓"みたいな変なパラメータがくっついてしまいます。

まぁ実害は・・・多分ないと思うけど、鬱陶しいのでそれを外す方法。
<%= form_tag("/hoge", :method => :get) %>
  <%= テキストタグとか %>
<%- end -%>

と何気なくformを作成しようとすると、

な感じになって、変なパラメータがひっついてきます。
POSTだといいけど、GETだと若干かっこ悪いです。

てか、そもそもコレは何の為?

って事で、調べてみると古いIE対策?みたいな事が言われてました。
>The _utf8 input tag forces Internet Explorer to properly respect your form’s character encoding.
Rails forms automatically insert a hidden utf8 field? (a.k.a. what’s with the checkmark/snowman?)

古いIEと言われても、私の中ではIEはもうIE8以前は葬式上げてもいいよレベルな旧型だと思ってるので、そんだけ言われても困る。

って事でさらに調べると、どうやらIE5(笑)らしい。
> This is here to support Internet Explorer 5 and encourage it to use UTF-8 for its forms.
What is the _snowman param in Ruby on Rails 3 forms for?

IE5とか全身全霊を込めてSHIRUKA!と叫べるレベルなので安心して消すことにします。
上記URLの中でも、我々が運用しているサービスはそんな古いIEは相手にしてないみたいな事を書かれてるしw 何で残ってるんだ。。。

で、消し方なんですが"FormTagHelper"ヘルパー内の"utf8_enforcer_tag"メソッドで上記の余計な事をやっているみたいなので、これをoverrideすればいいらしいです。
Override utf8_enforcer_tag using Rails custom form builder?

overrideのやり方は上記URLに書いてあるとおり、"config/initializers"配下に適当なファイルを作って上書きする処理を書くだけ。
# coding: utf-8
module ActionView
  module Helpers
    module FormTagHelper
      def utf8_enforcer_tag
        ""
      end
    end
  end
end

railsを再起動し、上記formを表示すると・・消えてる!

と、思ったら別画面のformで"authenticity_token"が丸見え状態に!!
ぶっちゃけリリース直前まで行ったよ!マジかよ怖すぎる!!

さらに調べると戻り値に対して(空文字であっても)サニタイズが掛かっていないと、自動で付与される別のhiddenタグごとサニタイズしてしまうみたい。

なので以下の様に直しました。
# coding: utf-8
module ActionView
  module Helpers
    module FormTagHelper
      def utf8_enforcer_tag
        "".html_safe
      end
    end
  end
end

これでちゃんと表示されず、他のformも問題なく表示されるようになりました。

なお自分の調べ方が悪かったのか、あまり日本語サイトに情報がなかったので、もし同じ目にあってる方の参考になれば。

実は特定バージョンだけ出る変なバグなのか、他にもっといい方法があるのかも。

参考までにrailsとrubyのバージョンは↓な感じです。
# rails3.2.13(ruby 1.9.3p374)

nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。