我怎样才能让一个check_box_tag为未选中时发表“假”或“0”参数?(How can I m

2019-06-23 21:21发布

用下面的check_box_tag:

<%= check_box_tag 'object[boolean_attribute]', 1, object.boolean_attribute %>

我只能在一个方向更新boolean_attribute:从虚假到真实的。

当默认为未选中(因为object.boolean_attribute是假的),我检查,然后提交表单,答:boolean_attribute => 1个参数公布。

但是 ,当我尝试更新从真到假没有参数没有通过,所以boolean_attribute仍是如此。

换句话说,默认选中时(因为object.boolean_attribute是真实的),我取消它,然后提交表单,一个:boolean_attribute => 0 贴。

未选中时boolean_attribute => 0参数:我怎样才能让这个check_box_tag张贴?

从API我想不通,如果有一些选项传递轻松实现它: http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-check_box_tag

谢谢。

编辑

出于某种原因,我无法捉摸,在我的实际代码(带嵌套许多-to-many关联)的hidden_​​field_tag不工作。

<%= hidden_field_tag 'order[preparations_attributes][][cooked]', nil %>
<%= check_box_tag 'order[preparations_attributes][][cooked]', '1', preparation.cooked? %>

现在我有相反的问题:我可以取消选中该复选框,并为aspected准备进行更新,但如果我选中复选框它搅乱了PARAMS。

以下是未选中的方框张贴PARAMS:

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:

我觉得我碰到了与深嵌套的资源形式和param传递一个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疑难杂症”切换到select_tag是可接受的解决方法。

无论如何,感谢您的答案!

Answer 1:

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:嵌套处理资源(产品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

检查2 3复选框给我的params就象这样:

{..., “产品”=> { “标题”=> “RoR的书”, “line_items_attributes”=> { “0”=> { “批准”=> “0”, “ID”=> “47” }, “1”=> { “批准”=> “1”, “ID”=> “48”}, “2”=> { “批准”=> “1”, “ID”=> “51” }}}, “提交”=> “更新产品”, “动作”=> “动作1”, “控制器”=> “测试”}

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允许我用一行代码更新相关line_items:

@product.update_attributes params[:product]

我希望它能帮助。



Answer 2:

您可以使用复选框之上的隐藏字段:

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

这样一来,即使没有被选中你的复选框,你仍然可以得到nil提交。 那会为你工作?



Answer 3:

如果任何人有柱boolean类型和使用check_box_tag再看看这个。 它为我工作。 <%= hidden_field_tag 'order[preparations_attributes][][cooked]', 'false' %> <%= check_box_tag 'order[preparations_attributes][][cooked]', true, preparation.cooked? %>



Answer 4:

在我的Rails应用程序,我需要周围的真假添加单引号。

原代码

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

更新后的代码

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

我希望帮助别人!



Answer 5:

对于数组像复选框,你可以使用哈希太:

= hidden_field_tag "ad_ids[#{ad.token}]" , false
= check_box_tag "ad_ids[#{ad.token}]" , true, true


文章来源: How can I make a check_box_tag to post a 'false' or '0' parameter when unchecked?