具有多个嵌套模型的Rails表单会导致无线电组出现问题

我遇到了包含单选按钮的嵌套模型表单的问题,当我有多个模型时,所有单选按钮都被视为在同一组中。

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

然后我有一个部分使用创建OrderItem模型表单

  

并且在此表单中包含一组在for循环中创建的单选按钮

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

当只有一个子节点时,这样可以正常工作,但是当我插入多个子name="order[order_items_attributes][][colour_id]"所有单选按钮都属于同一个组,因为它们都具有相同的属性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'提供了expected Hash (got Array) for param 'order_items_attributes'的错误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"=>"sdfg@sgf.com"} 

当存在两个嵌套模型时:

 {"order_items_attributes"=> [{"size"=>"Small", "colour_id"=>"4"}, {"size"=>"Small"}], "first_name"=>"sdf", "last_name"=>"sdf", "email"=>"sdfg@sgf.com"} 

正如您所看到的,只有第一个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,所以这应该是一个替代品。