Option from collection_select 在提交时创建一个新选项 - Rails 5

Option from collection_select creates a new one on submit - Rails 5

提问人:Ernest Mistiaen 提问时间:12/10/2019 更新时间:12/11/2019 访问量:290

问:

今天,我一直在研究我的插件和类别之间的 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

如果您错过了上下文,请告诉我。提前非常感谢您的帮助!:)

Ruby-on-Rails 表单 具有并属于许多 集合选择

评论


答:

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_selectmultiple: true<%= f.collection_select(:category_ids, Category.order(:name), :id, :name, {}, {multiple: true}) %>