Подтвердить что ты не робот

Синтаксис для form_for при создании массива из флажков

Я делаю форму для объекта Order, а в заказе много продуктов, через таблицу соединений, называемую 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 %>

Обычно для каждого продукта у меня будет check_box_tag, говоря

<%= check_box_tag "order[product_ids][]", product.id, @order.product_ids.include?(product.id) %>

Но это, работая отлично, всегда чувствует себя немного полицейским. Есть ли способ сделать это с помощью синтаксиса f.check_box? Важное замечание - в рассматриваемом проекте я работаю в Rails 2.2.2, поэтому решение, которое работает в rails 2, было бы идеальным.

4b9b3361

Ответ 1

Rails <= 2.x (оригинал)

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

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

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

  <% end -%>

<% end -%>

Rails >= 3.x (обновлено)

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

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

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

  <% end -%>

<% end -%>

Ответ 2

Я знаю, что автор искал ответы на версию 2, но это лучший хит для Google, и я, хотя я бы обновил:

Можно сделать это (я использую 4.0, не знаю, как далеко назад):

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

Для получения дополнительной информации: http://edgeapi.rubyonrails.org...

Ответ 3

Я делал несколько многократных форм флажков на протяжении многих лет и разных версий Rails. Rails никогда не предоставлял действительно чистый способ сделать это, но решение "cop out", которое вы придумали, довольно хорошо, не так ли? Это одна строка, она явная, и пока список продуктов достаточно короткий, он будет действовать адекватно.

Чтобы ответить на ваш конкретный вопрос, f.check_box никогда не будет работать для этого. Это просто короткая рука для check_box_tag, но ни одна семантика не применяется. Если вы хотите запустить Rails native, единственной возможностью, я думаю, является использование вложенных атрибутов. Частью проблемы является то, что нет такого очевидного способа работы этого типа. Ядро Rails прошло много планирования и обратной связи, чтобы придумать вложенные атрибуты, поскольку они существуют, и хотя они кажутся немного тупыми, они довольно часто используют наиболее распространенные варианты использования. Но вложенные атрибуты были введены в Rails 2.3, и, кроме того, они будут вводить довольно немного концептуальных накладных расходов для чего-то похожего на то, что ему не нужна сложность.

Есть также некоторые плагины, которые предоставляют помощники для этого, хотя я не использовал их в течение длительного времени (с тех пор как Rails 2 на самом деле). Мое впечатление, что они слишком переполнены, если у вас нет многих форм, которые используют этот шаблон.

Короче говоря, я думаю, вы должны продолжить свое решение.

Ответ 4

форматический камень

check_boxes очень полезно реализовать несколько флажков

как

f.input :yourcolumn, :as => :check_boxes, :collection => your_collection