代码之家  ›  专栏  ›  技术社区  ›  Lee McAlilly

Rails嵌套表单for has_many:through,在使用简单表单的连接模型上添加了一个字段

  •  0
  • Lee McAlilly  · 技术社区  · 5 年前

    我正试着做一个嵌套的表格 has_many :through 关联使用 Simple Form ,我不知道如何避开这个错误: ArgumentError in Variants#edit -- Association cannot be used in forms not associated with an object .

    以下是我试图实现的目标。我有一个“产品变体”模型(称为 Variant ).每个变体可以有许多部件( Part 模型)通过“零件清单项目”( PartsListItem )加入模特。每个变型都应该能够分配不同数量的零件。

    例如,吉他表带可能有一个称为“背衬织物”的部分,其数量为1。这意味着吉他表带变体需要1个“背衬织物”部件才能组装。但同一变体也可能有另一个零件,如“铆钉”,其数量为4。(如图4所示,制造该产品变体需要4个铆钉。)在使用 变种 要将所有不同数量的零件添加到变体中,我想在 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
    

    还有我的VariantController:

    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 模型

    0 回复  |  直到 5 年前
        1
  •  0
  •   Javkhlan Shirendev    5 年前

    我觉得你需要改变 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 %>