使用以下 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 为真)并且我取消选中它然后提交表单, :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 过早地关闭了 prepare_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) %>
我认为切换到 select_tag 以避免“hidden_field gotcha”是一种可接受的解决方法。
无论如何,谢谢你的答案!