ruby-on-rails - 用于 has_many 的 Rails 嵌套表单:通过使用简单表单的连接模型上的附加字段
问题描述
我正在尝试使用Simple Formhas_many :through
为关联做一个嵌套表单,但我不知道如何解决这个错误:ArgumentError in Variants#edit -- Association cannot be used in forms not associated with an object
这就是我想要完成的事情。我有一个“产品变体”模型(称为Variant
)。Part
每个变体都可以通过“零件列表项”( PartsListItem
) 连接模型具有许多零件(模型)。每个变体应该能够以不同的数量分配给它的零件。
例如,吉他背带可能有一个名为“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
模型上。
解决方案
我认为您需要更改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 %>
推荐阅读
- sql - 为 Firebase 数据库转换的 SQL 查询
- ruby-on-rails - 从另一个模块调用模块的选定方法
- java - JHipster/Spring Prod 启动静默失败
- javascript - 如何使用按钮停止和继续功能?
- haskell - 是 ha 句柄还是 lambda 函数(或两者)?
- azure - 如何在 Azure Maps 中绘制圆形路径?
- java - 我的 Connect Four 游戏在运行时返回完整
- php - 使用密钥在 Swift 应用程序和 MySQL 数据库之间建立安全连接?
- python - Python 3:根据缓冲将二进制文件写入标准输出
- php - laravel-query-grouByMonth-groupByYear-sumdata