【发布时间】:2021-04-28 13:36:01
【问题描述】:
我与collections 有多对多关系是product 的多选字段
products_controller.rb
def new
@product = Product.new
@product.collections.build
@product.categories.build
@product
end
def create
@product = Product.new(product_params)
...
end
private
def product_params
params.require(:product).permit(:product_id, :name, :price, :popularity,
collections_attributes: [ id: [] ])
end
产品型号
class Product < ApplicationRecord
validates :product_id, uniqueness: true
has_and_belongs_to_many :collections, optional: true
accepts_nested_attributes_for :collections, reject_if: ->(attributes){ attributes['id'].blank? }, allow_destroy: true
end
产品视图
<%= form.fields_for :collections do |fc| %>
<%= fc.label :collections %>
<%= fc.select(:id, Collection.all.collect { |c| [c.name, c.id] },
{ include_blank: true, include_hidden: false }, {multiple: true}) %>
<% end %>
但是,当我发帖到 /create 时,它说
products_params.inspect的日志
不太清楚它有什么问题。是不是因为ids 不能带数组?如果是这样,有什么解决方案。
任何帮助将不胜感激。谢谢!
更新
整个产品形式。请忽略product_id,因为它不是主键。
<%= form_with(model: product, local: true) do |form| %>
<% if product.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(product.errors.count, "error") %> prohibited this product from being saved:</h2>
<ul>
<% product.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="actions">
<%= form.label :product_id %>
<%= form.text_field :product_id %>
<%= form.fields_for :collections do |fc| %>
<%= fc.label :collections %>
<%= fc.select(:id, Collection.all.collect { |c| [c.name, c.id] },
{ include_blank: true, include_hidden: false }, {multiple: true}) %>
<% end %>
<%= form.submit %>
</div>
<% end %>
【问题讨论】:
-
你能展示整个表格吗?您只显示了其中的一部分
-
@Joel_Blum 不用担心。刚刚更新
-
您确定 form_with 正在获取新产品的实例吗?
-
@Joel_Blum,是的。在 new.html 我有
<%= render 'form', product: @product %>。我在帖子中包含了控制器的新方法。 -
@AustinP 我可能错了,但不应该是这样吗?
params.require(:product).permit(:product_id, :name, :price, :popularity, collections_attributes: [ :id ])
标签: ruby-on-rails ruby activerecord