Carriles formulario con múltiples modelos anidados provoca problemas con grupos de radio
-
21-09-2019 - |
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?
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.