Я пытаюсь создать вложенную форму для 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
модель.