チェックボックスで非チェック時にパラメタを送信する際の挙動が変わってる
最近SKIPのRails2.3.2対応をしていて大概の問題は既に情報が出し尽くされてるんだけど、情報が少なかったのでメモ。
チェックボックスに非チェック状態だとブラウザから何も送信されないので同名のhiddenを定義していたんだけど、2.3.2にするとチェックがついている/いないによらずhiddenの方のパラメタが飛ぶようになってしまっていた。
そんなわけで、lib/action_view/helpers/form_helper.rbにあるActionView::Helpers::InstanceTag#to_checkbox_tagを見る。
2.2.2だと以下のようにcheckbox -> hiddenになっており
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) end
2.3.2だと以下のようにhidden -> checkboxの順になっている。
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) hidden = tag("input", "name" => options["name"], "type" => "hidden", "value" => options['disabled'] && checked ? checked_value : unchecked_value) checkbox = tag("input", options) hidden + checkbox end
というわけでhiddenを書いてからcheckboxを書くようにして解決した、が、根本原因がわからん。なんで逆にしないとダメになったんだ??