次の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はnot投稿。
このチェックボックスをオンにして、チェックを外したときに:boolean_attribute => 0パラメーターを投稿するにはどうすればよいですか?
APIから、簡単に達成するために渡すオプションがあるかどうかわかりません: http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-check_box_tag
ありがとうございました。
[〜#〜] edit [〜#〜]
何らかの理由で、私は推測できません。実際のコード(ネストされた多対多の関連付け)では、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"}
「調理済み」=> ""から始まるチェックボックスをチェックすると、なんらかの理由で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_field gotcha」を回避するためにselect_tagに切り替えることは、許容できる回避策だと思います。
とにかく、答えてくれてありがとう!
check_box
(w_o _tag
)ヘルパーは、問題に対処するために非表示フィールドを追加します。
<%= check_box 'object', 'boolean_attribute', {}, 'true', 'false' %>
# result:
<input name="object[boolean_attribute]" type="hidden" value="false" />
<input id="object_boolean_attribute" name="object[boolean_attribute]" type="checkbox" value="true" />
PD:ネストされたリソースの処理(製品accepts_nested_attributes_for
:line_items)
= form_for @product, url: '' do |f|
%p
= f.label :title
= f.text_field :title
= f.fields_for :line_items do |li|
= li.check_box :approved
= li.label :approved, li.object.id
%br
= f.submit
3つのチェックボックスのうち2つをチェックすると、次のようにparams
が表示されます。
{...、 "product" => {"title" => "RoR book"、 "line_items_attributes" => {"0" => {"approved" => "0"、 "id" => "47" }、 "1" => {"承認済み" => "1"、 "id" => "48"}、 "2" => {"承認済み" => "1"、 "id" => "51" }}}、 "commit" => "Update Product"、 "action" => "action1"、 "controller" => "test"}
読みやすさのためにYAMLとしてparams
:
product: title: RoR book line_items_attributes: '0': approved: '0' id: '47' '1': approved: '1' id: '48' '2': approved: '1' id: '51'
見る?非表示フィールドはありませんが、チェック/未チェック状態は明確に区別されます。
このparams
を使用すると、1行のコードを使用して関連するline_itemsを更新できます。
@product.update_attributes params[:product]
役に立てば幸いです。
チェックボックスの上に隠しフィールドを使用できます:
<%= hidden_field_tag 'object[boolean_attribute]', nil %>
これにより、チェックボックスがオフになっていても、nil
が送信されます。それはあなたのために働くでしょうか?
誰かがブール型の列を持ち、check_box_tag
を使用している場合は、これを見てください。それは私のために働いた。 <%= hidden_field_tag 'order[preparations_attributes][][cooked]', 'false' %> <%= check_box_tag 'order[preparations_attributes][][cooked]', true, preparation.cooked? %>
私のRailsアプリでは、trueとfalseを単一引用符で囲む必要がありました。
元のコード
<%= f.check_box :admin, {}, true, false %>
更新されたコード
<%= f.check_box :admin, {}, 'true', 'false' %>
それが他の誰かに役立つことを願っています!
チェックボックスのような配列の場合、ハッシュも使用できます。
= hidden_field_tag "ad_ids[#{ad.token}]" , false
= check_box_tag "ad_ids[#{ad.token}]" , true, true