2011-08-01 79 views
2

我有2個模型產品和字體。產品「has_many:fonts,:through =>:product_available_fonts」。將has_many用於update_attributes:通過連接表上的屬性

我有一個JavaScript/jQuery UI創建一個窗體傳遞給導軌來更新這些關聯。在UI中,您可以在配置期間將現有的Font添加到產品。您也可以重新排列字體的順序。此訂單作爲字段「訂單」存儲在加入產品和字體表的ProductAvailableFont對象中。 目前,字體被添加至:

params[:product][:font_ids] = ["1","2","4"…] 

@product.update_attributes(params[:product]) 
控制器

。爲了通過

params[:product][:product_available_font_attributes] = [ 
    {"id"=>"1", "order"=>"2"}, 
    {"id"=>"2", "order"=>"1"} 
] 

的問題是創建窗體時,對於剛添加到產品中一個字體沒有ProductAvailableFont對象更新。當我沒有ID時,我怎樣才能定義它的訂單屬性?

回答

0

對於誰運行到這個人,這解決了我們的代碼這個問題的結論是隻使用product[product_available_font_attributes][id][]所有知道的,那麼對於所有product[product_available_font_attributes][font_id][]知道的,其次是product[product_available_font_attributes][font_id][]針對所有字體的補充。你必須確保你在id元素後面的表單中存在所有現有對象的font_id元素,並且它們是,要麼,否則rails會混淆它們。

+0

對於在另一端有問題的窺視,你的控制器動作是什麼樣的? – ctilley79

+0

@product = Product.find(params [:id]) @ product.update_attributes(params [:product]) 正如在所有軌道中的標準CRUD更新方法一樣。 –

+0

你還可以添加寫在模型中的關係嗎?特別是連接表模型 –

1

首先,我建議將連接表的名稱更改爲products_fonts(兩個詞都是複數形式,並保留「可用」)。如果我理解正確,它有一個product_id,font_id和訂單字段(它是自己的ID,你不應該使用它)。

當用戶向產品添加字體(假定字體已經存在)時,您的form/javascript/client應該向服務器發送一個新的訂單對象,並帶有嵌套的fonts_products屬性。如果你已經正確配置了模型關係,Rails應該在服務器端自動處理它。

爲了獲得正確的POST請求,大部分的魔法都是由Rails的表單構建器完成的。你想重現與JavaScript?這可能會很棘手。

+0

你是對的,我們正試圖在javascript中重現此操作。什麼是正確的方式來使用表單構建器來合併添加新的子連接對象和設置現有的屬性?如果我可以得到這麼多,將它移植到JavaScript並不是很困難。 –

+0

這有幫助嗎? http://railscasts.com/episodes/196-nested-model-form-part-1 雖然我聽說rails 3.1中的內容有點不同。 –

相關問題