问题描述
我有以下型号:产品,零件和产品零件
product.rb
class Product < ApplicationRecord
has_many :product_parts
has_many :parts,through: :product_parts
accepts_nested_attributes_for :product_parts,allow_destroy: true
end
part.rb
class Part < ApplicationRecord
has_many :product_parts
has_many :products,through: :product_parts
end
product_part.rb
class ProductPart < ApplicationRecord
belongs_to :part
belongs_to :product
end
该产品可能由几个部分组成,例如product1 = 1pcs part2和3pcs part 3。
我有联接表:product_parts
create_table "product_parts",force: :cascade do |t|
t.integer "part_id"
t.integer "product_id"
t.integer "quantity"
t.index ["part_id"],name: "index_product_parts_on_part_id"
t.index ["product_id"],name: "index_product_parts_on_product_id"
end
我想为新产品呈现简单的表单,其中:
- 我可以输入产品名称
- 从所有零件中选择零件并定义每个零件数量
我有这样的_form.html.slim:
= simple_form_for(@product) do |f|
= f.error_notification
= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present?
= f.input :name
= f.simple_fields_for :parts do |part|
= f.label :part.name
= f.input :part.quantity
= f.button :submit
但是它不会渲染任何东西。您有任何提示以正确的方式进行操作吗?
我也试图这样做:
_form.html.slim
= simple_form_for(@product) do |f|
= f.input :name
= f.simple_fields_for :parts do |part|
== render 'part_fields'
= f.button :submit
_part_fields.html.slim
= :name
= part.input :quantity
服务器日志输出为:
17:34:21 web.1 | Started GET "/products/new" for ::1 at 2020-08-24 17:34:21 +0200
17:34:21 web.1 | Processing by ProductsController#new as HTML
17:34:21 web.1 | Rendering products/new.html.slim within layouts/application
17:34:21 web.1 | Part Load (0.1ms) SELECT "parts".* FROM "parts" LIMIT ? [["LIMIT",11]]
17:34:21 web.1 | ↳ app/views/products/_form.html.slim:6
17:34:21 web.1 | CACHE Part Load (0.0ms) SELECT "parts".* FROM "parts" LIMIT ? [["LIMIT",11]]
17:34:21 web.1 | ↳ app/views/products/_form.html.slim:6
17:34:21 web.1 | Rendered products/_part_fields.html.slim (Duration: 442.5ms | Allocations: 233999)
17:34:21 web.1 | Rendered products/_form.html.slim (Duration: 449.1ms | Allocations: 240331)
17:34:21 web.1 | Rendered products/new.html.slim within layouts/application (Duration: 451.5ms | Allocations: 242361)
17:34:21 web.1 | Completed 500 Internal Server Error in 454ms (ActiveRecord: 0.4ms | Allocations: 243658)
17:34:21 web.1 |
17:34:21 web.1 |
17:34:21 web.1 |
17:34:21 web.1 | ActionView::Template::Error - undefined local variable or method `part' for #<#<Class:0x00007f938cd03f28>:0x00007f938cd020b0>
17:34:21 web.1 | Did you mean? @parts:
17:34:21 web.1 | app/views/products/_part_fields.html.slim:2:in `view template'
谢谢大家的回答。我在GitHub上找到了示例: rails-recipes。现在我正在使用cocoon gem,并且我几乎在想要的地方:)但是:
_form.html.slim
= simple_form_for(@product) do |f|
= f.input :name
|Parts
fieldset#parts
= f.simple_fields_for :product_parts do |product_part|
== render 'product_part_fields',f: product_part
= link_to_add_association 'Add part',f,:product_parts,class: 'btn btn-primary btn-xs'
= f.button :submit
_product_part.html.slim:
.nested_fields.field
= f.input :quantity
= f.collection_select :part_id,Part.all,:id,:name
= link_to_remove_association f
渲染表单时,我已经有两部分输入,而不是一个(这应该是正确的)。 我不想创建新零件,只需从列表中选择零件并仅插入数量即可。 看起来像这样: screenshot of rendered form
产品未创建,在重新加载表单后,我将始终拥有2部分的字段。 这是控制台日志:
12:58:14 web.1 | Started POST "/products" for ::1 at 2020-08-28 12:58:14 +0200
12:58:14 web.1 | Processing by ProductsController#create as HTML
12:58:14 web.1 | Parameters: {"authenticity_token"=>"dLVq3gUUeHnmFgVxQ7gXATOF3wdQ75a/csjmjzYN6HFrr9duoi50M4KzrSUNj/QHCrJgXO2myJPdpkybdTB0cA==","product"=>{"name"=>"Product #1","product_parts_attributes"=>{"0"=>{"quantity"=>"4","part_id"=>"134","_destroy"=>"false"},"1"=>{"quantity"=>"5","part_id"=>"168","2"=>{"quantity"=>"","part_id"=>"266","3"=>{"quantity"=>"","part_id"=>"260","4"=>{"quantity"=>"","part_id"=>"262","5"=>{"quantity"=>"","part_id"=>"259","_destroy"=>"false"}}},"commit"=>"Create Product"}
12:58:14 web.1 | (0.2ms) begin transaction
12:58:14 web.1 | ↳ app/controllers/products_controller.rb:29:in `block in create'
12:58:14 web.1 | Part Load (0.2ms) SELECT "parts".* FROM "parts" WHERE "parts"."id" = ? LIMIT ? [["id",134],["LIMIT",1]]
12:58:14 web.1 | ↳ app/controllers/products_controller.rb:29:in `block in create'
12:58:14 web.1 | Part Load (0.1ms) SELECT "parts".* FROM "parts" WHERE "parts"."id" = ? LIMIT ? [["id",168],266],260],262],259],1]]
12:58:14 web.1 | ↳ app/controllers/products_controller.rb:29:in `block in create'
12:58:14 web.1 | (0.2ms) rollback transaction
12:58:14 web.1 | ↳ app/controllers/products_controller.rb:29:in `block in create'
我在做什么错呢?:
- 我有两部分可供选择,而不是采用新呈现的形式
- 无法创建产品和products_parts
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)