Tengo un problema con los formularios de modelo anidados que contienen botones de opción; cuando tengo varios modelos, todos los botones de selección se tratan como pertenecientes al mismo grupo.Los rieles con múltiples modelos anidados causan problemas con los grupos de radio
Mi modelo contiene una relación has_many así:
class Order < ActiveRecord::Base
has_many :order_items
accepts_nested_attributes_for :order_items
end
Class OrderItem < ActiveRecord::Base
belongs_to :order
end
entonces tengo una parcial que se crea la forma OrderItem
modelo usando
<% fields_for "order[order_items_attributes][]", order_item do |f| %>
Y contenida en este formulario es un grupo de botones de opción creado dentro de un ciclo for con
radio_button_tag "order[order_items_attributes][][colour_id]", "#{colour.id}"
T su trabajo funciona bien cuando solo hay un niño, sin embargo, tan pronto como inserto varios niños, todos los botones de radio pertenecen al mismo grupo, ya que todos tienen el mismo atributo name="order[order_items_attributes][][colour_id]"
. Esto es todo en un formulario de modelo nuevo, así que no puedo usar índices de matriz (name="order[order_items_attributes][0][colour_id]"
) ya que Rails da el error expected Hash (got Array) for param 'order_items_attributes'
Estaba equivocado sobre esa última parte, el error fue porque estaba mezclando atributos de nombre indexados y no indexados. Agregar valores de índice fue la clave para resolver esto.
Aquí es el contenido de la params[:order]
de hash cuando sólo un modelo anidado está presente:
{"order_items_attributes"=>
[{"size"=>"Small",
"colour_id"=>"4"],
"first_name"=>"sdf",
"last_name"=>"sdf",
"email"=>"[email protected]"}
Y cuando dos modelos anidados están presentes:
{"order_items_attributes"=>
[{"size"=>"Small",
"colour_id"=>"4"},
{"size"=>"Small"}],
"first_name"=>"sdf",
"last_name"=>"sdf",
"email"=>"[email protected]"}
como se puede ver sólo la primera order_item
tiene su atributo colour_id. Esto ocurre independientemente del modelo al que pertenezca el botón de opción seleccionado (lo cual tiene sentido).
¿Cómo puedo representar los botones de opción de manera que creen un grupo separado para cada modelo secundario?
Sería útil si pudiera pegar el contenido del hash de parámetros [: order] para el caso en el que solo hay 1 order_item anidado (es decir, el caso que funciona) y para el caso donde hay más de 1 order_item anidado (es decir, el caso donde no funciona). Para ambos ejemplos, ejecute hash de params [: order] a través de pretty print antes de pegarlo en Stack Overflow. – nelstrom