2015-10-26 76 views
1

该标题是一口。使用has_many:通过fields_for和复选框来创建关联

所以我有这样的事情:

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

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

回答

0

这样做:

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

没有fields_for

这将对具有下列PARAMS控制器陪同:

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

不完全确定这是这里的问题,但我认为这可能是因为你的控制器不允许使用伙伴id数组。因此,您公司控制器中的company_partner_params需要允许像partner_attributes这样的内容:[:id]。这里的语法可能不完全正确,但如果这是你错过的东西,你应该环顾四周。

这是我认为的形式应该是这样的:

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

是的它不是,它不会更新,它的渲染错误。 '<%= p.check_box:partner_id%>'不起作用,因为它将Partner作为对象(来自Partner.all)而不是关联。 – beamercola

+0

我的一半解决方案是为控制器中的每个合作伙伴构建关联。但是当我确定一些正确的语法会使它发生时,看起来像一个老鼠巢窝 – beamercola

+0

我还没有使用rails的这个特性,但是我用过的语法有些不同。我在form_for块中拥有块的字段。也许尝试一下。 – baron816

相关问题