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

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_itemcolour_id属性を持っています。これは、選択したラジオボタンがどのモデルに属していたかに関係なく発生します(これは理にかなっています)。

子モデルごとに個別のグループを作成するようにラジオボタンをレンダリングするにはどうすればよいですか?

4

1 に答える 1

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に投稿しているように見えるので、これは交換のドロップになるはずです。

于 2009-10-16T16:12:07.643 に答える