使用 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
来达到这个目的:)
这个标题有点啰嗦。
所以我有这样的东西:
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
来达到这个目的:)