¿Cómo puedo crear múltiples instancias de un modelo asociado a partir de un formulario de rieles 3 cuando no sé cuántos voy a agregar?

Tengo un formulario_for que crea una nueva 'Estimación' y cada una de estas estimaciones puede tener un número ilimitado de 'Artículos' (esto es como un número de pieza, pero tendrá su propio conjunto de atributos). Me gustaría poder crear tantas instancias del modelo de Elementos asociados como desee antes de enviar el formulario que crea la nueva Estimación, y luego hacer que cree todos los Elementos asociados que van con esa Estimación.

He leído mucho en la API sobre form_for y accept_nested_attributes_for, he buscado en Google extensamente y he visto los railscasts sobre formularios de modelos anidados, y he leído mi libro de rails 3, pero aún no he encontrado una 'forma de rieles' para crear todos estos nuevos objetos de una sola vez desde el mismo formulario. En el railscast, Ryan tiene algo como esto en el controlador:

def new  
  @estimate = Estimate.new  
  3.times { @estimate.items.build }  
end

Sin embargo, no sé cuántos artículos habrá en cada estimación. Tampoco estoy seguro de qué fields_for sintaxis debería usar en la vista, pero entiendo que probablemente tendré que usar JavaScript para crear dinámicamente nuevos campos de formulario.

Así es como se relacionan mis modelos:

class Estimate < ActiveRecord::Base
  has_many :items
  accepts_nested_attributes_for :items
end

y:

class Item < ActiveRecord::Base
  belongs_to :estimates
end

Entonces, ¿alguna idea? Como dije, puedo hacer que mi aplicación haga esto (probablemente usaré mucho AJAX), pero esperaba que alguien pudiera tener una solución más bonita.

Gracias.

preguntado el 08 de febrero de 11 a las 17:02

Creo que la ruta que estás siguiendo es la mejor forma de hacerlo. ¡Usando JavaScript puede agregar dinámicamente tantos registros asociados como desee! ¿Eso no es lo suficientemente bonito? -

1 Respuestas

??? tu camino es el mejor camino de rieles. ¿Quizás no sepa cómo crear un formulario para artículos? Por Rails Guides o Rails API, puede escribir lo siguiente:

<%= form_for @estimate do |f| %>
  <p>
    <%= f.label :xxx %>
    <%= f.text_field :xxx %>
  </p>
  <%= f.fields_for :items do |item_field| %>
    <p>
      <%= item_field.label :yyy %>
      <%= item_field.text_field :yyy %>
    </p>
  <% end %>
<% end %>

Y puedes usar la gema muuuy buena, 'nested_form'. ver: https://github.com/ryanb/nested_form

Respondido 09 Feb 11, 03:02

Sí, estaba confundido porque normalmente creas nuevas instancias de los objetos y las asignas a variables de instancia en tu nueva acción en el controlador. Sin embargo, no sé cuántos objetos nuevos va a agregar el usuario. Luego, una vez que se publica el formulario, no estoy seguro de cómo el controlador manejará el almacenamiento de los nuevos objetos que pertenecen al padre recién creado ... Creo que podría hacer que jQuery haga todo esto con Ajax cuando envíe el formulario que crea al padre, para que pueda controlarlo mejor ... - marcusM

vale, te sugiero una joya, formulario_anidado. Esta es la forma más sencilla de manejar un formulario nuevo. Esta joya tiene un gran documento simple y agradable para crear o eliminar un nuevo formulario. - Tatsuro Baba

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.