使用 has_many :through 与 fields_for 和复选框来创建关联

Using has_many :through with fields_for and checkboxes to create associations

这个标题有点啰嗦。

所以我有这样的东西:

class Company < ActiveRecord::Base
  has_many :company_partner_associations
  has_many :partners, through: :company_partner_associations
end

class CompanyPartnerAssociation
  belongs_to :company
  belongs_to :partner
end

class Partner
  has_many :company_partner_associations
  has_many :companies, through: :company_partner_associations
end

在公司表格上,我试图列出所有合作伙伴,旁边有一个复选框。如果我选中一个,它会创建关联。如果我取消选中它会破坏。

<%= f.fields_for :company_partner_associations, Partner.all do |p| %>
    <%= f.check_box :partner_id %>
<% end %>

失败,因为通过的 object 是合作伙伴,因此获得 undefined partner_id on Partner

我确信那里有绝妙的解决方案!谢谢!

不完全确定这是问题所在,但我认为可能是您的控制器不允许合作伙伴 ID 数组。因此,在您公司控制器的 company_partner_params 中,需要允许类似 partner_attributes: [:id] 的内容。那里的语法可能不完全正确,但如果这是你遗漏的东西,你应该四处寻找。

我认为表单应该如下所示:

<%= form_for @company do |f| %>
    <%= f.fields_for :partners, Partner.all do |partner| %>
    ...
    <% end %>
<% end %>

这样做:

<%= f.collection_check_boxes :partner_ids, Partner.all, :id, :name %>

没有fields_for.

这必须在控制器中附带以下参数:

params.require(:company).permit(:company, :params, partner_ids: [])

这应该在您的 @company 模型中设置 partner_ids

使用HABTM,您可以通过填充“collection_singular_ids”方法来声明关联数据; HMT 有相同的方法附加了 has_many relation:

虽然这会替换当前的关联对象,但比调用f.fields_for要简单得多——尤其是挑选伙伴

--

您也可以使用 collection_check_boxes 来达到这个目的:)