多个嵌套模型的导轨形式导致广播组的问题
我有一个包含单选按钮的嵌套模型表单的问题,当我有多个模型时,所有单选按钮被视为在同一组中。多个嵌套模型的导轨形式导致广播组的问题
我的模型包含这样一个的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属性。无论所选单选按钮属于哪个模型(这是有道理的),都会发生这种情况。
如何渲染单选按钮,以便为每个子模型创建一个单独的组?
当您调用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,所以这应该是一个更换的下降。
谢谢,这就是它!我曾尝试使用Firebug手动添加索引值,但遇到了我提到的错误,原来这是因为我有其他表单字段并混合了索引和非索引名称属性。 – roryf 2009-10-16 17:44:32
如果您可以粘贴params [:order]哈希值的内容对于仅存在1个嵌套order_item(即工作情况)的情况以及对于存在多于1个嵌套order_item的情况将是有帮助的(即它不起作用的情况)。对于这两个示例,在粘贴到堆栈溢出之前,通过漂亮打印运行params [:order]散列。 – nelstrom 2009-10-16 15:09:13