2009-10-16 11 views
5

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?

+0

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

Respuesta

3

Debe dar a cada elemento de pedido un índice único cuando llame a fields_for. Si llama a fields_for de esta manera, necesita realizar un seguimiento del índice de la matriz que pasa a fields_for. Rails puede hacer esto por usted mediante el uso de formularios anidados.

La solución es utilizar formularios anidados.

<%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%> 

Parece que está publicando en el orders_controller por lo que este debería ser un reemplazo.

+0

¡Gracias, esto fue exactamente! Intenté agregar manualmente los valores de índice usando Firebug pero estaba obteniendo el error que mencioné, resultó que esto se debía a que tenía otros campos de formulario y estaba mezclando el índice y los atributos de nombre no indexados. – roryf

Cuestiones relacionadas