koukiblog

たぶんweb系の話題

Railsのutf8パラメータとcommitパラメータ

Railsで検索フォームみたいなのを作るとき、RailsGuide通りにすると

<%= form_tag("/search", :method => "get") do %>

  <%= label_tag(:q, "Search for:") %>

  <%= text_field_tag(:q) %>

  <%= submit_tag("Search") %> 

<% end %>

↑みたいなコードになり、フォームから遷移するURLに
「/search?utf8=✓&q=&commit=Search」
のようにutf8パラメータとcommitパラメータがつきます。
まぁ別に困らないのだけど、よくわらないパラメータがURLに追加されるのはいまいち。。
ちょっと気になったので、それぞれ調べてみました。

・utf8パラメータ
出力自体は、↓のutf8_enforcer_tagで行われています。
https://github.com/rails/rails/blob/3-2-stable/actionpack/lib/action_view/helpers/form_tag_helper.rb#L607

helperでoverrideしろと書いてあるので、気になる場合は、overrideすればよいようです。
ただし、戻り値をなくしてしまうと、このメソッドの戻り値に対してさらにタグを追加するのでエラーが発生してしまいます。
空文字を返しておけばok。

もうちょっと調べてみると、このパラメータは、古いIE対策にセットされたものようです。
http://stackoverflow.com/questions/4104474/rails-3-utf-8-query-string-showing-up-in-url
IE5以前は、accept_charsetが無視されてしまうとかなんとか。
submitするときに、パラメータに強制的にunicode文字を含めることで対応しています。
元々は雪だるまだったのだけど、現状のRailsではチェックマークになったみたいですね。

・commitパラメータ
どのボタンが押さたのか、サーバ側で判断できるように、デフォルトでついているようです。
(params[:commit] みたいな感じで)
submit_tagから出力されるHTMLがデフォルトで下記のようになっているので、commitパラメータが付加されます。

<input name="commit" type="submit" value="Save changes">

ソースは、↓のようになっているので
https://github.com/rails/rails/blob/3-2-stable/actionpack/lib/action_view/helpers/form_tag_helper.rb#L428

submit_tag のoptionとして :name=nil を渡せばok

  <%= submit_tag "Search", :name => nil %>

とすれば、inputタグのname属性が出力されなくなります。