多个嵌套模型的导轨形式导致广播组的问题

问题描述:

我有一个包含单选按钮的嵌套模型表单的问题,当我有多个模型时,所有单选按钮被视为在同一组中。多个嵌套模型的导轨形式导致广播组的问题

我的模型包含这样一个的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

当您调用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