text_field_tag tag select_tag rails form_with form_for form ruby-on-rails radio-button actionview

ruby on rails - tag - Los raíles se forman con múltiples modelos anidados que causan problemas con los grupos de radio



rails select_tag (1)

Debe asignar 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 usar 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ás publicando en el control orders_ por lo que este debería ser un reemplazo.

Tengo un problema con los formularios de modelos anidados que contienen botones de opción. Cuando tengo varios modelos, todos los botones de opción se consideran como pertenecientes al mismo grupo.

Mi modelo contiene una relación has_many como esta:

class Order < ActiveRecord::Base has_many :order_items accepts_nested_attributes_for :order_items end Class OrderItem < ActiveRecord::Base belongs_to :order end

Luego tengo un parcial que crea el OrderItem modelo OrderItem usando

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

Y dentro de este formulario se encuentra un grupo de botones de radio creados dentro de un ciclo for con

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

Esto 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 name="order[order_items_attributes][][colour_id]" atributo name="order[order_items_attributes][][colour_id]" . Esto es todo en un nuevo modelo, 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 mal 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í está el contenido del hash de params[:order] cuando solo está presente un modelo anidado:

{"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 puede ver, solo el primer 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 renderizar los botones de opción de modo que cree un grupo separado para cada modelo hijo?