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=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
つまり、
の後ろの方が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
リンク元
- 10 http://rubyist.g.hatena.ne.jp/
- 5 http://rubyist.g.hatena.ne.jp/hiro-ueda/20080112/1200111879
- 4 http://rubyist.g.hatena.ne.jp/diarylist
- 1 http://mail.google.com/mail/?ui=2&view=bsp&ver=1qygpcgurkovy
- 1 http://reader.livedoor.com/subscribe/http://rubyist.g.hatena.ne.jp/yyamasak/20091125
- 1 http://www.google.co.jp/search?q=rails ドキュメント&hl=ja&lr=lang_ja&client=firefox-a&rls=org.mozilla:ja:official&hs=UEY&tbo=1&tbs=rcnt:1,sbd:1
- 1 http://yahoo2.in/matome/index.php?mozi=Rails
- 1 http://rubyist.g.hatena.ne.jp/hsyd/
- 1 http://rubyist.g.hatena.ne.jp.s.hatena.com/.rss
- 1 http://rubyist.g.hatena.ne.jp/keyword/exception