Синтаксис для 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, было бы идеальным.
Ответы
Ответ 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