使用has_many:through with fields_for和checkboxes来创建关联

时间:2015-10-26 21:02:30

标签: ruby-on-rails has-many-through

这个头衔是满口的。

所以我有这样的事情:

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

失败,因为传递的对象是合作伙伴,因此获取undefined partner_id on Partner

我确定那里有一个漂亮的解决方案!谢谢!

2 个答案:

答案 0 :(得分:0)

这样做:

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

fields_for

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

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

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

使用HABTM,您可以通过填充“collection_singular_ids”方法来声明关联数据; HMT具有与has_many relation

相同的方法

enter image description here

虽然这将替换当前关联的对象,但它比调用f.fields_for简单得多 - 特别是对于挑选合作伙伴。

-

您也可以使用collection_check_boxes来实现此目的:)

答案 1 :(得分:-1)

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

这就是我认为表格应该是这样的:

toolBar.items?.removeAtIndex(0)
toolBar.items?.insert(playButton, atIndex: 0)