2015-10-26 202 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