Вложенная форма Rails для has_many: through с дополнительным полем в модели соединения с использованием Simple Form - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь создать вложенную форму для has_many :through ассоциации, используя Простую форму , и я не могу понять, как обойти эту ошибку: ArgumentError in Variants#edit -- Association cannot be used in forms not associated with an object.

Вот что я пытаюсь сделать.У меня есть модель «Вариант продукта» (называется Variant).Каждый вариант может иметь много деталей (Part модель) через модель соединения «Элемент списка деталей» (PartsListItem).Каждый вариант должен иметь возможность назначать ему части в разных количествах.

Например, у гитарного ремешка может быть деталь под названием "Backing Fabric", которая имеет количество 1. Это означает, что необходим вариант с гитарным ремешком1 части «Ткань основы» для сборки.Но тот же вариант может также иметь другую деталь, такую ​​как «Заклепка», количество которой равно 4. (Как и в случае с 4 заклепками, для создания этого варианта продукта требуется.) После использования формы Variant добавьте все детали в различных количествах.к варианту я хотел бы показать все детали с количествами на странице variants#show.

Вот соответствующий код из моих моделей:

class Variant < ApplicationRecord
  has_many :parts_list_items, dependent: :destroy
  has_many :parts, through: :parts_list_items, dependent: :nullify

  accepts_nested_attributes_for :parts
end

class PartsListItem < ApplicationRecord
  belongs_to :variant
  belongs_to :part
end

class Part < ApplicationRecord
  has_many :parts_list_items, dependent: :destroy
  has_many :variants, through: :parts_list_items, dependent: :nullify
end

И мой VariantsController:

class VariantsController < ApplicationController
  def update
    respond_to do |format|
       if @variant.update(variant_params)
         format.html { redirect_to @variant, notice: 'Variant was successfully updated.' }
       else
         format.html { render :edit }
       end
    end
  end

  private
  def variant_params
    params.require(:variant).permit(:account_id, :product_id, :sku,
                                    :choice_ids => [], :part_ids => [])
  end
end

И моя форма (views / варианты / _edit_form.html.erb):

<%= simple_form_for @variant do |f| %>
  <%= f.simple_fields_for :parts_list_items do |item| %>
    <%= item.input_field :quantity %>
    <%= item.association :parts %>
  <% end %>
<% end %>

Обратите внимание, что это прекрасно работает:

<%= simple_form_for @variant do |f| %>
  <%= f.association :parts, as: :check_boxes %>
<% end %>

Таким образом, он работает, чтобы связать детали непосредственно с вариантом через модель соединения PartsListItem.Проблема начинается, когда я начинаю пытаться добавить количество для каждой связанной детали.

Что я делаю не так с этой вложенной формой?Есть ли проблема с моими контроллерами или ассоциациями?

Нужно ли создавать дополнительную модель с именем PartsList, которая has_many :parts_list_items с дополнительными ассоциациями?Это кажется дополнительным шагом и должен быть способ поставить :quantity на PartsListItem модель.

1 Ответ

0 голосов
/ 24 сентября 2019

Я думаю, вам нужно изменить parts на part

<%= simple_form_for @variant do |f| %>
  <%= f.simple_fields_for :parts_list_items do |item| %>
    <%= item.input_field :quantity %>
    <%= item.association :parts %> <!-- HERE -->
  <% end %>
<% end %>
...