如何在未选中时使check_box_tag发布'false'或'0'参数?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在未选中时使check_box_tag发布'false'或'0'参数?相关的知识,希望对你有一定的参考价值。
使用以下check_box_tag:
<%= check_box_tag 'object[boolean_attribute]', 1, object.boolean_attribute %>
我只能在一个方向更新布尔属性:从false到true。
如果默认情况下未选中(因为object.boolean_attribute为false)并且我检查它然后提交表单,则发布a:boolean_attribute => 1参数。
但是,当我尝试从true更新为false时,没有传递param,因此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过早地关闭了准备属性hash!
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) %>
我认为切换到select_tag以避免“hidden_field gotcha”是一种可接受的解决方法。
无论如何,谢谢你的答案!
check_box
(没有_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
检查3个复选框中的2个给我params
如下:
{...,“product”=> {“title”=>“RoR book”,“line_items_attributes”=> {“0”=> {“approved”=>“0”,“id”=>“47” },“1”=> {“approved”=>“1”,“id”=>“48”},“2”=> {“approved”=>“1”,“id”=>“51” },}“commit”=>“更新产品”,“操作”=>“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
允许我使用一行代码来更新相关的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
以上是关于如何在未选中时使check_box_tag发布'false'或'0'参数?的主要内容,如果未能解决你的问题,请参考以下文章
PHP JQuery Checkbox - 如果复选框被预先选中,它不会在未选中时删除“选中”属性