Formularz szyny z wieloma zagnieżdżonymi modelami powoduje problemy z grupami radiowymi
Mam problem z zagnieżdżonymi formularzami modeli, które zawierają przyciski opcji, gdy mam wiele modeli, wszystkie przyciski opcji są traktowane jako należące do tej samej grupy.
Mój model zawiera relację has_many w następujący sposób:
class Order < ActiveRecord::Base
has_many :order_items
accepts_nested_attributes_for :order_items
end
Class OrderItem < ActiveRecord::Base
belongs_to :order
end
Mam wtedy częściowy, który tworzyOrderItem
formularz modelu za pomocą
<% fields_for "order[order_items_attributes][]", order_item do |f| %>
W tym formularzu znajduje się grupa przycisków radiowych utworzonych wewnątrz pętli for
radio_button_tag "order[order_items_attributes][][colour_id]", "#{colour.id}"
Działa to dobrze, gdy jest tylko jedno dziecko, jednak gdy tylko wstawię wiele dzieci, wszystkie przyciski radiowe należą do tej samej grupy, ponieważ wszystkie mają ten sam atrybutname="order[order_items_attributes][][colour_id]"
. To wszystko w nowej formie modelu, więc nie mogę używać indeksów tablicowych (name="order[order_items_attributes][0][colour_id]"
) gdy Railsy dają błądexpected Hash (got Array) for param 'order_items_attributes'
Myliłem się co do tej ostatniej części, błąd polegał na tym, że miksowałem indeksowane i nieindeksowane atrybuty nazw. Dodanie wartości indeksu było kluczem do rozwiązania tego problemu.
Oto zawartośćparams[:order]
hash, gdy obecny jest tylko jeden model zagnieżdżony:
{"order_items_attributes"=>
[{"size"=>"Small",
"colour_id"=>"4"],
"first_name"=>"sdf",
"last_name"=>"sdf",
"email"=>"[email protected]"}
A kiedy obecne są dwa modele zagnieżdżone:
{"order_items_attributes"=>
[{"size"=>"Small",
"colour_id"=>"4"},
{"size"=>"Small"}],
"first_name"=>"sdf",
"last_name"=>"sdf",
"email"=>"[email protected]"}
Jak widać tylko pierwszyorder_item
ma atrybut colour_id. Dzieje się tak niezależnie od modelu, do którego należał wybrany przycisk radiowy (co ma sens).
Jak mogę renderować przyciski radiowe w taki sposób, aby tworzył osobną grupę dla każdego modelu potomnego?