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 为真)并且我取消选中它然后提交表单, :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”是一种可接受的解决方法。

无论如何,谢谢你的答案!

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:处理嵌套资源(产品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"=>"更新产品", "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,我可以使用一行代码来更新相关的 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

如果有人有列类型 boolean 并使用,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被认为不存在,因此结果为真或假。

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