Ruby on Rails - submit_tag で付加される commit, utf8 パラメータ!
Updated:
Ruby on Rails で submit_tag
メソッドを使用して submit
タグを生成すると、Submit 後の URL に自分の意識していないパラメータが勝手に付加されます。 utf8
と commit
です。
以下、現象と対策方法についての備忘録です。
0. 前提条件
- Rails 4.1.0 での作業を想定。
1. 現象確認
例えば、Rails の HTML 生成部分(erb ファイル)を以下のようにしたとする。
<%= form_tag({controller: "hoge", action: "fuga" }, {method: "get"}) do %>
<!-- セレクトボックス、テキストボックス、ラジオボタン -->
<%= submit_tag("検 索") %>
<% end %>
すると、生成後の HTML は以下のようになる。
<form accept-charset="UTF-8" action="/jmaxml" method="get">
<!-- セレクトボックス、テキストボックス、ラジオボタン -->
<input name="commit" type="submit" value="検 索" />
</form>
そして、ボタン押下後の URL は以下のようになる。
http://<・・・>/hoge/fuga?utf8=✓&commit=検 索
2. commit パラメータについて
2-1. 原因
HTML の name="commit"
や URL の commit=検 索
は、押下されたボタンをサーバ側で判断できるようにデフォルトで付加される機能のようだ。
2-2. 対策
1つのフォームで複数のボタンを使用しないのなら区別する必要もない。その場合は、 name
属性に nil
を指定すればよい。
区別する必要があるのなら、明示的に name
属性を指定すればよい。
<%= form_tag({controller: "hoge", action: "fuga" }, {method: "get"}) do %>
<!-- セレクトボックス、テキストボックス、ラジオボタン -->
<%= submit_tag("検 索", name: nil) %>
<% end %>
3. utf8 パラメータについて
3-1. 原因
古い Internet Explorer 対策のためにデフォルトで付加されるパラメータのようだ。
- rails/actionpack/lib/action_view/helpers/form_tag_helper.rb at 4-0-stable · rails/rails
- What is the _snowman param in Ruby on Rails 3 forms for? - Stack Overflow
- Rails 3 UTF-8 query string showing up in URL? - Stack Overflow
3-2. 対策
“config/intializers” ディレクトリ配下に適当な名前でファイルを作成し、以下のような内容を記述すればよいようだ。
File: config/initializers/utf8_enforcer_tag.rb
1
2
3
4
5
6
7
8
9
module ActionView
module Helpers
module FormTagHelper
def utf8_enforcer_tag
"".html_safe
end
end
end
end
(html_safe
は authenticity_token エラー防止のため)
4. 動作確認
Rails を再起動して、生成される HTML を確認してみる。
<form accept-charset="UTF-8" action="/jmaxml" method="get">
<!-- セレクトボックス、テキストボックス、ラジオボタン -->
<input type="submit" value="検 索" />
</form>
Submit 後の URL も確認してみる。 utf8=✓
も commit=検 索
も無くなったはずである。
これで URL がスッキリしました。
以上。
Comments