チェックボックスで非チェック時にパラメタを送信する際の挙動が変わってる

最近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を書くようにして解決した、が、根本原因がわからん。なんで逆にしないとダメになったんだ??