如何在未选中时使check_box_tag发布“false”或“0”参数? [英] How can I make a check_box_tag to post a 'false' or '0' parameter when unchecked?
问题描述
使用以下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没有param传递,所以boolean_attribute仍然为真。
换句话说,当默认情况下检查(因为object.boolean_attribute为true)并且取消选中它然后提交表单时,a:boolean_attribute => 0是不发布的。
如何使此check_box_tag在未选中时发布:boolean_attribute => 0参数?
确定是否有一些选项可以轻松实现:
http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-check_box_tag
谢谢。
EDIT
由于某种原因,我不能在我的实际代码多对多关联)hidden_field_tag不工作。
<%= hidden_field_tag'order [preparing_attributes] []煮熟],无%>
<%= check_box_tag'order [prepare_attributes] [] [cooked]','1',prepare.cooked? %>
现在我有相反的问题:我可以取消选中复选框,准备更新为aspected,
以下是未选中框的已发布参数:
<$参数:{utf8=>✓,authenticity_token=>bGgPGbk + Cuk2q + LEgqetmk4e7xie8dB3iMP9Cj3SUm0 =,order=> {customer_name=> ;Duccio Armenise,duedate=>2012-04-25 09:24:00.000000,preparations_attributes=> [{quantity=>1,description=&自定义食谱,种类=>自定义,烹饪=>,recipe_id=>9,id=>86quantity_attributes=& {ingredient_id=>,qty=>,_destroy=>0},{ingredient_id=>11,qty=> ,id=>193,_destroy=>0}],_destroy=>0}],add_preparation=> {recipe_id=& }},continue=>确认,id=>31}
现在看看当我检查复选框,从cooked=>开始,由于某种原因Rails正在关闭prepare_attributes哈希太早了!
参数:{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食谱,种类=>自定义,熟=>},{cooked=>1,recipe_id=>9,id=> 86,quantities_attributes=> [{ingredient_id=>,qty=>,_destroy=>0},{ingredient_id=>11 ,q=>5.0,id=>193,_destroy=>0}],_destroy=>0}],add_preparation > {recipe_id=>}},继续=>确认,id=>31}
编辑#2 :
我想我遇到了一个与深度相关的Rails错误嵌套资源表单和参数传递: https://github.com/rails/rails/issues/5937 p>
现在我使用了一个select_tag:
%= select_tag'order [preparing_attributes] [] [cooked]',options_for_select({yes:1,no:0},prepare.cooked? ? 1:0)%>
我认为切换到一个select_tag为了避免hidden_field gotcha是一个可以接受的解决方法。
无论如何,谢谢你的答案!
check_box
(w / o _tag
)助手添加了隐藏字段以解决您的问题:
<%= check_box' ','boolean_attribute',{},'true','false'%>
#result:
< input name =object [boolean_attribute]type =hiddenvalue =false/>
< input id =object_boolean_attributename =object [boolean_attribute]type =checkboxvalue =true/>
UPD:处理嵌套资源(产品 accept_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
:
{0=> {已批准=>0 ,id=>47},1=> {已批准=>1,id=>48},2=> ,id=>51}}},commit=>Update Product,action=>action1,controller=>test}
params
作为YAML的可读性:
产品:
title:RoR book
line_items_attributes:
'0':
approved:'0'
id:'47'
'1':
approved:'1'
id:'48'
'2':
approved:'1'
id:'51'
有这个 params
允许我使用一行用于更新关联的line_item的代码:
@ product.update_attributes params [:product]
我希望它有帮助。
With the following check_box_tag:
<%= check_box_tag 'object[boolean_attribute]', 1, object.boolean_attribute %>
I can update the boolean_attribute in only one direction: from false to true.
When is unchecked by default (because object.boolean_attribute is false) and I check it and then submit the form, a :boolean_attribute => 1 parameter is posted.
But, when I try to update from true to false no param is passed, so the boolean_attribute remains true.
In other words, when is checked by default (because object.boolean_attribute is true) and I uncheck it and then submit the form, a :boolean_attribute => 0 is not posted.
How can I make this check_box_tag to post a :boolean_attribute => 0 parameter when unchecked?
From the api I can't figure out if there is some option to pass to easily achieve it: http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-check_box_tag
Thank you.
EDIT
For some reason I cannot fathom, in my actual code (with a nested many-to-many association) the hidden_field_tag is not working.
<%= hidden_field_tag 'order[preparations_attributes][][cooked]', nil %> <%= check_box_tag 'order[preparations_attributes][][cooked]', '1', preparation.cooked? %>
Now I have the opposite problem: I can uncheck the checkbox and the preparation is updated as aspected, but if I check the checkbox it messes up the params.
Here are the posted params for the unchecked box:
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"}
Now see what a mess when I check the checkbox, beginning from "cooked"=>" ", for some reason Rails is closing the preparation_attributes hash too early!
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"}
EDIT #2:
I think I ran into a Rails bug related to deep nested resource forms and param passing: https://github.com/rails/rails/issues/5937
For now I made it to work with a select_tag:
<%= select_tag 'order[preparations_attributes][][cooked]', options_for_select({yes: 1, no: 0}, preparation.cooked? ? 1 : 0) %>
I think that switching to a select_tag in order to avoid the "hidden_field gotcha" is an acceptable workaround.
Anyway, thank you for the answers!
解决方案
check_box
(w/o_tag
) helper adds hidden field to address your problem for you:<%= 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: Dealing with nested resources (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
Checking 2 of 3 checkboxes gives me the
params
as this:{..., "product"=>{"title"=>"RoR book", "line_items_attributes"=>{"0"=>{"approved"=>"0", "id"=>"47"}, "1"=>{"approved"=>"1", "id"=>"48"}, "2"=>{"approved"=>"1", "id"=>"51"}}}, "commit"=>"Update Product", "action"=>"action1", "controller"=>"test"}
params
as YAML for readability:product: title: RoR book line_items_attributes: '0': approved: '0' id: '47' '1': approved: '1' id: '48' '2': approved: '1' id: '51'
See? No hidden fields but checked/unchecked states are clearly distinguished.
Having this
params
allows me to use one line of code to update associated line_items:@product.update_attributes params[:product]
I hope it helps.
这篇关于如何在未选中时使check_box_tag发布“false”或“0”参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!