次のcheck_box_tagを使用します。
<%= check_box_tag 'object[boolean_attribute]', 1, object.boolean_attribute %>
boolean_attributeは、falseからtrueへの一方向にのみ更新できます。
がデフォルトでオフになっている場合(object.boolean_attributeがfalseであるため)、チェックしてからフォームを送信すると、:boolean_attribute=>1パラメーターが送信されます。
しかし、trueからfalseに更新しようとすると、パラメーターは渡されないため、boolean_attributeはtrueのままです。
つまり、デフォルトでチェックされている場合(object.boolean_attributeがtrueであるため)、チェックを外してフォームを送信すると、:boolean_attribute=>0は投稿されません。
このcheck_box_tagを作成して、チェックを外したときに:boolean_attribute => 0パラメーターを投稿するにはどうすればよいですか?
APIから、簡単に達成するために渡すオプションがあるかどうかわかりません:http: //api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-check_box_tag
ありがとうございました。
編集
何らかの理由で、実際のコード(ネストされた多対多の関連付けを使用)では、hidden_field_tagが機能していません。
<%= hidden_field_tag 'order[preparations_attributes][][cooked]', nil %>
<%= check_box_tag 'order[preparations_attributes][][cooked]', '1', preparation.cooked? %>
今、私は反対の問題を抱えています:チェックボックスをオフにすると、準備がアスペクトとして更新されますが、チェックボックスをオンにすると、パラメータが台無しになります。
チェックされていないボックスに投稿されたパラメータは次のとおりです。
Parameters: {"utf8"=>"✓", "authenticity_token"=>"bGgPGbk+Cuk2q+LEgqetmk4e7xie8dB3iMP9Cj3SUm0=", "order"=>{"customer_name"=>"Duccio Armenise", "duedate"=>"2012-04-25 09:24:00.000000", "preparations_attributes"=>[{"quantity"=>"1", "description"=>"custom recipe", "kind"=>"custom", "cooked"=>"", "recipe_id"=>"9", "id"=>"86", "quantities_attributes"=>[{"ingredient_id"=>"", "qty"=>"", "_destroy"=>"0"}, {"ingredient_id"=>"11", "qty"=>"5.0", "id"=>"193", "_destroy"=>"0"}], "_destroy"=>"0"}], "add_preparation"=>{"recipe_id"=>""}}, "continue"=>"Confirm", "id"=>"31"}
「cooked」=>「」から始めてチェックボックスをオンにすると、何が混乱するかがわかります。何らかの理由で、Railsがpreparation_attributesハッシュを閉じるのが早すぎます。
Parameters: {"utf8"=>"✓", "authenticity_token"=>"bGgPGbk+Cuk2q+LEgqetmk4e7xie8dB3iMP9Cj3SUm0=", "order"=>{"customer_name"=>"Duccio Armenise", "duedate"=>"2012-04-25 09:24:00.000000", "preparations_attributes"=>[{"quantity"=>"1", "description"=>"custom recipe", "kind"=>"custom", "cooked"=>""}, {"cooked"=>"1", "recipe_id"=>"9", "id"=>"86", "quantities_attributes"=>[{"ingredient_id"=>"", "qty"=>"", "_destroy"=>"0"}, {"ingredient_id"=>"11", "qty"=>"5.0", "id"=>"193", "_destroy"=>"0"}], "_destroy"=>"0"}], "add_preparation"=>{"recipe_id"=>""}}, "continue"=>"Confirm", "id"=>"31"}
編集#2:
ネストされた深いリソースフォームとパラメーターの受け渡しに関連するRailsのバグに遭遇したと思います:https ://github.com/rails/rails/issues/5937
今のところ、select_tagで動作するようにしました。
<%= select_tag 'order[preparations_attributes][][cooked]', options_for_select({yes: 1, no: 0}, preparation.cooked? ? 1 : 0) %>
「hidden_fieldgotcha」を回避するためにselect_tagに切り替えることは、許容できる回避策だと思います。
とにかく、答えてくれてありがとう!