Синтаксис form_for при построении массива из флажков - PullRequest
26 голосов
/ 13 января 2012

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

Ответы [ 4 ]

43 голосов
/ 19 января 2012

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

<% @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 -%>
31 голосов
/ 02 ноября 2013

Я знаю, что автор искал ответы версии 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. ..

1 голос
/ 24 января 2012

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

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

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

0 голосов
/ 02 сентября 2016

Формационный камень

опция check_boxes очень хороша для реализации нескольких флажков

как

f.input :yourcolumn, :as => :check_boxes, :collection => your_collection
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...