Как использовать коллекцию Rails select внутри блока - PullRequest
4 голосов
/ 18 июня 2019

Я использую Простую форму в своем отслеживании ресурсов электронной торговли в Rails 6, и мне нужно иметь несколько выборок коллекции в моей форме, которые отображаются на основе ассоциации.

Вотмодель данных:

Product
   has_many Option(s)
Option
   has_many Choice(s)
   belongs_to Product
Choice
   has_many Variant(s)
   belongs_to Option
Variant
   belongs_to Choice(s)

Таким образом, продукт может выглядеть следующим образом:

Product => T-Shirt
Options => Size { choices: small, medium, large }, Color { choices: red, green, blue }
Variant #1 => T-Shirt in Medium Red, etc.

Как создать выборку для параметров продукта, если не у каждого продукта будет одинаковое числовариантов, которые клиент должен будет выбрать, такие как размер или цвет?Некоторые продукты могут иметь 0 вариантов, другие 1 (например, просто цвет), 2 (например, размер и цвет), 3 и т. Д.

Итак, в форме Вариант я хотел бы собрать коллекции, которые принадлежатсвязанный продукт.Я могу показать их в представлении «Вариант #» следующим образом:

<ul>
  <% @product.options.each do |option| %>
    <li>
      <%= option.name %>
      <ul>
        <% option.choices.each do |choice| %>
          <li><%= choice.name %></li>
        <% end %>
      </ul>
    </li>
  <% end %>
</ul>

Это работает, как и ожидалось, в представлении «Вариант # шоу».

Но как вы делаете то же самое исобрать 0 или более вариантов с их связанными вариантами в форме варианта с collection_select?Я использую простую форму, поэтому я пытаюсь что-то вроде этого, но это не работает, и я заблокирован:

<% @variant.product.options.each do |option| %>
    <div class='form-row'>
      <div class='col'>
        <%= f.label option.name %>
        <% option.choices.each do |choice| %>
          <%= f.association choice %>
        <% end %>
      </div><!-- /.col -->
    </div><!-- /.form-row -->
  <% end %>

Эта версия формы дает мне следующую ошибку:

RuntimeError in Variants#edit

enter image description here

...