41

次の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に切り替えることは、許容できる回避策だと思います。

とにかく、答えてくれてありがとう!

4

6 に答える 6

52

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" />

UPD:ネストされたリソースの処理 (Product 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"}

params読みやすくするために YAML として:

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]

お役に立てば幸いです。

于 2012-04-23T12:44:26.343 に答える
32

チェックボックスの上に隠しフィールドを使用できます。

<%= hidden_field_tag 'object[boolean_attribute]', nil %>

これにより、チェックボックスがオンになっていない場合でも、nil送信されます。それはあなたのために働くでしょうか?

于 2012-04-23T12:33:23.807 に答える
6

誰かがブール型の列を持っていて、これを使用しているcheck_box_tag場合は、これを見てください。それは私のために働いた。 <%= hidden_field_tag 'order[preparations_attributes][][cooked]', 'false' %> <%= check_box_tag 'order[preparations_attributes][][cooked]', true, preparation.cooked? %>

于 2015-09-26T05:38:54.460 に答える
1

Rails アプリでは、true と false を一重引用符で囲む必要がありました。

元のコード

<%= f.check_box :admin, {}, true, false %>

更新されたコード

<%= f.check_box :admin, {}, 'true', 'false' %>

それが他の誰かに役立つことを願っています!

于 2016-12-10T11:02:39.000 に答える
0

チェックボックスのような配列の場合、ハッシュも使用できます。

= hidden_field_tag "ad_ids[#{ad.token}]" , false
= check_box_tag "ad_ids[#{ad.token}]" , true, true
于 2015-06-16T15:44:14.230 に答える
0

関数をそのまま使いません.present?か?nil存在しないと見なされ、結果として true または false になります。

= check_box_tag :show_nav, @obj.show_nav.present?
于 2022-02-24T23:17:04.507 に答える