【问题标题】:Rails nested form for has_many :through with an additional field on the join model using Simple Form用于 has_many 的 Rails 嵌套表单:通过使用简单表单的连接模型上的附加字段
【发布时间】:2019-09-23 22:30:04
【问题描述】:

我正在尝试使用 Simple Formhas_many :through 关联创建嵌套表单,但我不知道如何解决此错误:ArgumentError in Variants#edit -- Association cannot be used in forms not associated with an object

这就是我想要完成的。我有一个“产品变体”模型(称为Variant)。每个变体都可以通过“部件列表项”(PartsListItem) 连接模型具有许多部件(Part 模型)。每个变体都应该能够分配不同数量的部件。

例如,吉他背带可能有一个名为“Backing Fabric”的部件,其数量为 1。这意味着 Guitar Strap 变体需要组装 1 个“Backing Fabric”部件。但同一个变体可能还有另一个零件,例如数量为 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/variants/_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 模型上。

【问题讨论】:

    标签: ruby-on-rails simple-form nested-forms has-many-through


    【解决方案1】:

    我认为您需要将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 %>
    

    【讨论】:

    • 谢谢。我应该在我的问题中提到我尝试过。 part 给了我同样的错误:Association cannot be used in forms not associated with an object。就好像我需要先创建零件和变体之间的关联,然后我可以向变体添加带有数量的parts_list_item,但这最好以嵌套形式完成。似乎我正在为一些简单的事情而苦苦挣扎。
    猜你喜欢
    • 2015-12-02
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    相关资源
    最近更新 更多