2014-05-02 99 views
0

所以我有一個類模型Rails的嵌套與check_box循環屬性

class Category < ActiveRecord::Base 
has_many :provider_categories 
has_many :providers, :through => :provider_categories 
end 

和提供程序模型

class Provider < ActiveRecord::Base 
has_many :provider_categories 
has_many :categories, :through => :provider_categories 

accepts_nested_attributes_for :provider_categories, :allow_destroy => true 
end 

這裏是我的provider_category模型

class ProviderCategory < ActiveRecord::Base 
belongs_to :provider 
belongs_to :category 
end 

我想創建嵌套表單以將類別包含到提供者表單中

= form_for @provider do |f| 
    ... 
    [email protected]_index do |category,index| 
    =f.fields_for :provider_category, category do |pl| 
     =pl.check_box :category_id 
     =pl.label category.name 
     =pl.hidden_field :provider_id, value: @provider.id 

當網頁加載完畢後我得到的複選框未配合

undefined method `category_id' for #<Category:0x0000010184ff60> 

編輯:

如果我改變:CATEGORY_ID到ID它的工作原理,但HTML outpuy看起來像這樣

<input name="provider[provider_category][id]" type="hidden" value="0"><input checked="checked" id="provider_provider_category_id" name="provider[provider_category][id]" type="checkbox" value="1"> 
<label for="provider_provider_category_Acupuncture">Acupuncture</label> 
<input id="provider_provider_category_provider_id" name="provider[provider_category][provider_id]" type="hidden" value="1"> 

編輯2:

我結束了使用check_box_tag

[email protected]_index do |category| 
    =f.fields_for :provider_category, category do |pl| 
    .li 
     =check_box_tag "provider[provider_category][category_id]", category.id 
     =pl.label category.name 
     =pl.hidden_field :provider_id, value: @provider.id 

現在HTML輸出似乎是正確的,但它不保存。當我選擇多個項目,這是從節約

"provider"=>{"name"=>"Mr. Awesome", "phone"=>"999-999-9999", "email"=>"[email protected]", "address"=>"awesome land", "provider_category"=>{"category_id"=>"3", "provider_id"=>"1"}}, "commit"=>"Save", "id"=>"1"} 

我做了選擇3個選項,但只有加入到哈希最後一個

我還增加了供應商類別供應商控制器的強烈PARAMS哈希

params.require(:provider).permit(..., :provider_categories => [:category_id, :provider_id]) 

感謝您的幫助提前

回答

0

按你的模型定義,ProviderCategory有屬性category_idprovider_id。你得到的錯誤爲:

undefined method `category_id' for #<Category:0x0000010184ff60> 

因爲強似的ProviderCategory情況下,你已經通過Category類的一個實例。公告category

=f.fields_for :provider_category, category do |pl| 

傳遞和沒有命名的模型category_idCategory您會收到錯誤屬性。

要解決的是,僅僅更新視圖中的fields_for方法調用如下:

=f.fields_for :provider_categories, category.provider_categories.build do |pl| 

UPDATE

此外,你將不得不更新ProvidersController強PARAMS,這樣的記錄provider_categories正確地保存在數據庫中:

params.require(:provider).permit(..., :provider_categories_attributes => [:category_id, :provider_id]) 

使用provider_categories_attributes而不是provider_categories

更新2

OP了另外一個問題,對於未選中category_id,價值0正在通過與category_id設定爲0都拿到在provider_categories產生不正確的記錄。

建議通過傳遞reject_if選項accepts_nested_attributes_for方法調用中,如下所示Provider模型來拒絕那些記錄:

class Provider < ActiveRecord::Base 
    has_many :provider_categories 
    has_many :categories, :through => :provider_categories 
    accepts_nested_attributes_for :provider_categories, :allow_destroy => true, reject_if: proc { |attributes| attributes['category_id'] == "0" } 
end 

複選框未通過檢查類別的ID的,建議如下更新複選框代碼:

=pl.check_box :category_id, {}, category.id, 0 
+0

我仍然得到相同的錯誤我最終使用check_box_tag「provider [provider_category] ​​[category_id]」,category.id – Marrento

+0

'check_box_tag'是一種替代方案。但是你現在的代碼只需要修改一下就可以了。我想知道爲什麼你會得到同樣的錯誤。如果你想,並且很想知道我們可以在聊天http://chat.stackoverflow.com/rooms/48530/ror上進行調試 –