来自 collection_select 的选项在提交时创建一个新选项 - Rails 5

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

今天我一直在研究我的插件和类别之间的 HABTM 关联。我几乎可以正常工作了,但是 运行 遇到了 collection_select.

的麻烦

我的表单中有一个 select,我成功调用了所有现有类别,但是当我提交表单时,会创建一个新类别。例如我select类别合成器。提交的时候突然多了两个类,叫Synthesizer。我怎样才能使插件与类别关联,但不创建新插件?

这是我表单中的代码:

<%= 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

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

一个真正常见的新手误解是您需要嵌套属性来分配关联。 嵌套属性用于从与插件相同的形式创建全新类别(或编辑现有类别),通常最好避免使用。

请记住,categories_plugins 连接 table 上的类别和行之间存在巨大差异。你想创建后者。

您真正需要做的就是使用由 has_and_belongs_to_many.

创建的 _ids setter / getter
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

category_ids= setter 将自动处理 inserting/deleting 行到 categories_plugins 连接 table 中。