Hatena::Grouprubyist

yyamasakの日記

2009/11/25 (Wed)Rails2.3ではparamsの挙動が変わりました

Rails2.0.2のアプリを2.3.4に対応させてたところ、

チェックボックスの値をparams[:key]で参照すると常にhiddenの値になるという問題が発生していました。

例えば、

<%= check_box_tag 'abc', '1', @key %>
<%= hidden_field_tag 'abc', '0' %>

というテンプレートは

<input id="abc" name="abc" type="checkbox" value="1" />
<input id="abc" name="abc" type="hidden" value="0" />

となって、Submitした結果、チェックが入ってるときは

abc=1&abc=0

入ってないときは

abc=0

となり、Railsは先頭の値を見るので、params[:abc]は"1"か"0"を返すことができていたわけですが....

どうも、この動作が変わったせいで、常に最後の値を返すようになったようです。

今年初めにこれと同じか似たような問題が挙がっていますが、

https://rails.lighthouseapp.com/projects/8994/tickets/1863-check_box-doesnt-work-with-nested-forms

実は最後の値をとる仕様になったというのが正しくて、

ドキュメントの方が対応してないという状況みたいです。

http://github.com/rack/rack/commit/5c00dd698edb953b4bee432fa12a20ba69a067c1

つまり、

checked: abc=0&abc=1

not-checked: abc=0

の後ろの方がparams[:abc]の値になるようになった訳です。

確かに、これに対応すべく、form_helper.rbのcheckboxヘルパの方では、hiddenの方を前にするようになってました。だからこのAPIを使ってる場合は修正の必要はないです。

check_box_tag + hidden_field_tagを使って書いてる箇所はこの順番を逆にしてやる必要がありました。

#actionpack/lib/action_view/helpers/form_helper.rb
def to_check_box_tag(options = {}, checked_value = "1", unchecked_value = "0")
  options = options.stringify_keys
  options["type"]     = "checkbox"
  options["value"]    = checked_value
  if options.has_key?("checked")
    cv = options.delete "checked"
    checked = cv == true || cv == "checked"
  else
    checked = self.class.check_box_checked?(value(object), checked_value)
  end
  options["checked"] = "checked" if checked
  add_default_name_and_id(options)
-  tag("input", options) << tag("input", "name" => options["name"], "type" => "hidden", "value" => options['disabled'] && checked ? checked_value : unchecked_value)
+  hidden = tag("input", "name" => options["name"], "type" => "hidden", "value" => options['disabled'] && checked ? checked_value : unchecked_value)
+  checkbox = tag("input", options)
+  hidden + checkbox
end

こういうときに、あちこちにあるのを全部直すということをしないために、ちゃんとヘルパにしておくのがBetterでしょうね。

ゲスト



トラックバック - http://rubyist.g.hatena.ne.jp/yyamasak/20091125