从复选框构建数组时form_for的语法

Max*_*ams 26 ruby-on-rails

我正在为Order对象创建一个表单,并且该订单包含许多Products,通过名为OrderProducts的连接表.所以,我们有这样的事情:

<% @order = Order.new %>
<% form_for @order do |f| %>
  <% @products.each do |product| %>
    ... want to iterate over products here to build up "order[product_ids][]", with one checkbox per product
  <% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

通常对于每个产品我会有一个check_box_tag,说

<%= check_box_tag "order[product_ids][]", product.id, @order.product_ids.include?(product.id) %>
Run Code Online (Sandbox Code Playgroud)

但是,这一点,虽然工作正常,总觉得有点像警察.我有办法用f.check_box语法吗?重要提示 - 关于有问题的项目我在Rails 2.2.2中工作,因此在rails 2中工作的解决方案将是理想的.

Bra*_*rth 44

Rails <= 2.x(原创)

<% @products.each do |product| -%>

  <% fields_for 'product[]' , product do |product_fields| -%>

    [...]
    <%= product_fields.check_box :id %>

  <% end -%>

<% end -%>
Run Code Online (Sandbox Code Playgroud)

Rails> = 3.x(更新)

<% @products.each do |product| -%>

  <%= fields_for 'product[]' , product do |product_fields| -%>

    [...]
    <%= product_fields.check_box :id %>

  <% end -%>

<% end -%>
Run Code Online (Sandbox Code Playgroud)


Car*_*arl 31

我知道作者正在寻找版本2的答案,但这是谷歌和我的最热门,但我会更新:

一个人可以做到这一点(我使用4.0,不知道它有多远):

<%= form_for @order do |form| %>
  <%= form.collection_check_boxes(:product_ids, Product.all, :id, :labeling_method ) %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

欲了解更多信息:http://edgeapi.rubyonrails.org ...

  • 这不适用于Rails 3.2.13及以下版本:请参阅:http://apidock.com/rails/v4.0.2/ActionView/Helpers/FormOptionsHelper/collection_check_boxes (2认同)
  • 这是Rails 4+的正确答案 (2认同)