ラジオボタンを含むネストされたモデルフォームに問題があります。複数のモデルがある場合、すべてのラジオボタンが同じグループにあるものとして扱われます。
私のモデルには、次のような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
次に、を使用してモデルフォームを作成するパーシャルがあります
<% fields_for "order[order_items_attributes][]", order_item do |f| %>
このフォームには、forループ内に作成されたラジオボタンのグループが含まれています。
radio_button_tag "order[order_items_attributes][][colour_id]", "#{colour.id}"
これは、子が1つしかない場合は正常に機能しますが、複数の子を挿入するとすぐに、すべてのラジオボタンが同じ属性を持つため、すべてのラジオボタンが同じグループに属します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]
ネストされたモデルが1つしかない場合のハッシュの内容は次のとおりです。
{"order_items_attributes"=>
[{"size"=>"Small",
"colour_id"=>"4"],
"first_name"=>"sdf",
"last_name"=>"sdf",
"email"=>"sdfg@sgf.com"}
そして、2つのネストされたモデルが存在する場合:
{"order_items_attributes"=>
[{"size"=>"Small",
"colour_id"=>"4"},
{"size"=>"Small"}],
"first_name"=>"sdf",
"last_name"=>"sdf",
"email"=>"sdfg@sgf.com"}
ご覧のとおり、最初のものだけがorder_item
colour_id属性を持っています。これは、選択したラジオボタンがどのモデルに属していたかに関係なく発生します(これは理にかなっています)。
子モデルごとに個別のグループを作成するようにラジオボタンをレンダリングするにはどうすればよいですか?