【Rails3.2系開発】form_tagヘルパー利用時に"utf8=なんたら"というパラメータを吐かないようにした事 [rails]
仕事でハマったのでメモがてら。
Railsで"form_tag"ヘルパーを利用してformを作り、パラメータをGETで飛ばすと"?utf8=✓"みたいな変なパラメータがくっついてしまいます。
まぁ実害は・・・多分ないと思うけど、鬱陶しいのでそれを外す方法。
と何気なく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"配下に適当なファイルを作って上書きする処理を書くだけ。
railsを再起動し、上記formを表示すると・・消えてる!
と、思ったら別画面のformで"authenticity_token"が丸見え状態に!!
ぶっちゃけリリース直前まで行ったよ!マジかよ怖すぎる!!
さらに調べると戻り値に対して(空文字であっても)サニタイズが掛かっていないと、自動で付与される別のhiddenタグごとサニタイズしてしまうみたい。
なので以下の様に直しました。
これでちゃんと表示されず、他のformも問題なく表示されるようになりました。
なお自分の調べ方が悪かったのか、あまり日本語サイトに情報がなかったので、もし同じ目にあってる方の参考になれば。
実は特定バージョンだけ出る変なバグなのか、他にもっといい方法があるのかも。
参考までにrailsとrubyのバージョンは↓な感じです。
# rails3.2.13(ruby 1.9.3p374)
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)
コメント 0