提问人:Ernest Mistiaen 提问时间:12/10/2019 更新时间:12/11/2019 访问量:290
Option from collection_select 在提交时创建一个新选项 - Rails 5
Option from collection_select creates a new one on submit - Rails 5
问:
今天,我一直在研究我的插件和类别之间的 HABTM 关联。我几乎让它工作了,但遇到了麻烦。collection_select
我的表单中有一个选择,并且我成功地调用了所有现有的类别,但是当我提交表单时,会创建一个新的类别。例如,我选择“合成器”类别。当我提交时,我突然有两个类别,叫做合成器。我怎样才能使插件与类别相关联,但不会创建一个新类别?
这是我表单中的代码:
<%= f.fields_for :categories do |c| %>
<%= c.label :name %>
<%= c.collection_select :name, Category.order(:name), :name, :name, multiple: true, include_blank: true %>
<% end %>
这就是我设置强参数的方式:
def plugin_params
params.require(:plugin).permit(:name, :url, :image, :description, :categories_attributes => [:id, :name])
end
在我的插件模型中:
has_and_belongs_to_many :categories
accepts_nested_attributes_for :categories
如果您错过了上下文,请告诉我。提前非常感谢您的帮助!:)
答:
1赞
max
12/11/2019
#1
一个非常常见的新手误解是,您需要嵌套属性来分配关联。 嵌套属性用于从与插件相同的表单创建全新的类别(或编辑现有类别),通常最好避免使用。
请记住,连接表上的类别和行之间存在巨大差异。您想要创建后者。categories_plugins
您真正需要做的就是使用 has_and_belongs_to_many
创建的 setter/getter。_ids
class Plugin
has_and_belongs_to_many :categories
end
<%= form_with(model: @plugin) do |f| %>
# ...
<%= c.collection_select :category_ids, Category.order(:name), :id, :name, multiple: true, include_blank: true %>
# ...
<% end %>
def plugin_params
params.require(:plugin).permit(:name, :url, :image, :description, category_ids: [])
end
setter 将自动处理在categories_plugins联接表中插入/删除行。category_ids=
评论
0赞
Ernest Mistiaen
12/11/2019
再次感谢您对Max的帮助!在表格中,我需要围绕它还是?我都试过了,但直到现在都没有成功。即使我添加了 ,我仍然收到错误c.collection_select :category_ids ...
<%= f.fields_for :categories do |c| %>
f.collection_select :category_ids ...
params.require(:plugin).permit(:name, :url, :image, :description, category_ids: [])
Unpermitted parameter: :category_ids
0赞
Ernest Mistiaen
12/11/2019
找到了!我没有发送数组。未被识别。所以现在我添加了它,它有效!感谢您的帮助 Max :)collection_select
multiple: true
<%= f.collection_select(:category_ids, Category.order(:name), :id, :name, {}, {multiple: true}) %>
评论