Pregunta

estoy teniendo un problema con los modelos de formularios anidados que contienen botones de radio, cuando tenga múltiples modelos de todos los botones de radio son tratados como estar en el mismo grupo.

Mi modelo contiene una relación has_many como esto:

class Order < ActiveRecord::Base
    has_many :order_items
    accepts_nested_attributes_for :order_items
end

Class OrderItem < ActiveRecord::Base
    belongs_to :order
end

I después que tenga una parcial que crea el modelo de formulario OrderItem utilizando

<% fields_for "order[order_items_attributes][]", order_item do |f| %>

Y que aparecen en este formulario es un grupo de botones de radio creado dentro de un bucle for con

radio_button_tag "order[order_items_attributes][][colour_id]", "#{colour.id}"

Esto funciona bien cuando hay un solo hijo, sin embargo, tan pronto como insertar varios hijos todos los botones de radio pertenecen al mismo grupo, ya que todos tienen el mismo name="order[order_items_attributes][][colour_id]" atributo. Esto es todo en un nuevo modelo de formulario de modo que no puedo usar los índices de matriz (name="order[order_items_attributes][0][colour_id]") como carriles da expected Hash (got Array) for param 'order_items_attributes' de error Yo estaba equivocado acerca de la última parte, el error fue porque yo estaba mezclando en un índice y atributos de nombre no reajustables. La adición de los valores del índice fue la clave para resolver esto.

Aquí está el contenido de la hash de params[:order] cuando sólo un modelo anidada está presente:

{"order_items_attributes"=>
  [{"size"=>"Small",
    "colour_id"=>"4"],
 "first_name"=>"sdf",
 "last_name"=>"sdf",
 "email"=>"sdfg@sgf.com"}

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"=>"sdfg@sgf.com"}

Como se puede ver sólo el primer order_item tiene su atributo colour_id. Esto se produce independientemente de qué modelo en el botón de radio seleccionada pertenecía a (que tiene sentido).

¿Cómo puedo hacer que los botones de selección de tal manera que se crea un grupo separado para cada modelo niño?

¿Fue útil?

Solución

Se debe dar a cada posición del pedido de un índice único cuando se llama fields_for. Si llama fields_for de esta manera, lo que necesita para realizar un seguimiento del índice de la matriz se pasa a fields_for. Raíles pueden hacer esto para usted mediante el uso de formas anidadas.

La solución es utilizar formas anidadas.

<%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 eres el anuncio a orders_controller por lo que esta debe ser una gota en el reemplazo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top