2009-10-16 99 views
5

我有一個包含單選按鈕的嵌套模型表單的問題,當我有多個模型時,所有單選按鈕被視爲在同一組中。多個嵌套模型的導軌形式導致廣播組的問題

我的模型包含這樣一個的has_many關係:

class Order < ActiveRecord::Base 
    has_many :order_items 
    accepts_nested_attributes_for :order_items 
end 

Class OrderItem < ActiveRecord::Base 
    belongs_to :order 
end 

我然後具有部分創建使用

<% fields_for "order[order_items_attributes][]", order_item do |f| %> 

而包含在此形式中的OrderItem模型的形式是一組單選按鈕的創建在for循環內

radio_button_tag "order[order_items_attributes][][colour_id]", "#{colour.id}" 

T當只有一個孩子時,他的作品很好,但是當我插入多個孩子時,所有單選按鈕屬於同一個組,因爲它們都具有相同的屬性name="order[order_items_attributes][][colour_id]"。這是全部在一個新的模型形式,所以我不能使用數組索引(name="order[order_items_attributes][0][colour_id]")因爲Rails給出了錯誤expected Hash (got Array) for param 'order_items_attributes'我錯了最後一部分,錯誤是因爲我混合了索引和非索引名稱屬性。添加索引值是解決這個問題的關鍵。

這裏是params[:order]哈希的內容只有一個嵌套的模式存在:

{"order_items_attributes"=> 
    [{"size"=>"Small", 
    "colour_id"=>"4"], 
"first_name"=>"sdf", 
"last_name"=>"sdf", 
"email"=>"[email protected]"} 

當兩個嵌套模式存在:

{"order_items_attributes"=> 
    [{"size"=>"Small", 
    "colour_id"=>"4"}, 
    {"size"=>"Small"}], 
"first_name"=>"sdf", 
"last_name"=>"sdf", 
"email"=>"[email protected]"} 

正如你所看到的只是第一order_item有它的colour_id屬性。無論所選單選按鈕屬於哪個模型(這是有道理的),都會發生這種情況。

如何渲染單選按鈕,以便爲每個子模型創建一個單獨的組?

+0

如果您可以粘貼params [:order]哈希值的內容對於僅存在1個嵌套order_item(即工作情況)的情況以及對於存在多於1個嵌套order_item的情況將是有幫助的(即它不起作用的情況)。對於這兩個示例,在粘貼到堆棧溢出之前,通過漂亮打印運行params [:order]散列。 – nelstrom 2009-10-16 15:09:13

回答

3

當您調用fields_for時,您必須給每個訂購商品一個唯一索引。如果以這種方式調用fields_for,則需要跟蹤傳遞給fields_for的數組的索引。 Rails可以通過使用嵌套窗體爲你做到這一點。

解決方案是使用嵌套窗體。

<%form_for :order do |f|%> 
    Form stuff for this particular order. 
    If @order.order_items is empty you may need to build one before the next line. 
    <%f.fields_for :order_items do |oi_f| %> 
    Form stuff for this particular order_item (prefixed with oi_f.) 
    <%Colour.all.each do |colour| %> 
     <%=oi_f.radio_tag(:colour_id, colour.id)%> 
    <%end%> 
    <%end%> 
<%end%> 

看起來你正在發佈到orders_controller,所以這應該是一個更換的下降。

+0

謝謝,這就是它!我曾嘗試使用Firebug手動添加索引值,但遇到了我提到的錯誤,原來這是因爲我有其他表單字段並混合了索引和非索引名稱屬性。 – roryf 2009-10-16 17:44:32