2011-01-09 22 views
16

Soy nuevo en los rieles, así que esta es probablemente una pregunta básica. Intento crear un formulario donde el usuario pueda crear 3 registros a la vez. Quiero que el usuario solo tenga que hacer clic en el botón Enviar una vez. Estoy enviando a mi modelo de revisión un nombre, comentario y calificación. Actualmente, solo el último registro se ingresa en la base de datos.Rails 3 envíe un formulario con múltiples registros

<%= form_for([@user,@review]) do |f| %> 
<table> 
    <tr> 
    <td>Rank</td> 
    <td>Name</td> 
    <td>Comment</td> 
    </tr> 
    <tr> 
    <td>1</td> 
    <td><%= f.text_field :name %></td> 
    <td><%= f.text_field :comment %></td> 
    <%= f.hidden_field :rating, :value=> "5" %> 
    </tr> 
    <tr> 
    <td>2</td> 
    <td><%= f.text_field :name %></td> 
    <td><%= f.text_field :comment %></td> 
    <%= f.hidden_field :rating, :value=> "3" %> 
    </tr> 
    <tr> 
    <td>3</td> 
    <td><%= f.text_field :name %></td> 
    <td><%= f.text_field :comment %></td> 
    <%= f.hidden_field :rating, :value=> "1" %> 
    </tr> 
</table> 
    <div class="actions"> 
    <%= f.submit "Create my top 3" %> 
    </div> 
<% end %> 

Cualquier consejo es apreciado. Gracias.

Respuesta

26

Yo recomiendo usar fields_for para esto:

<%= form_for([@user, :reviews]) do |f| %> 
    <% @reviews.each do |review| %> 
    <%= fields_for review do |r| %> 
     <%= render "reviews/form", :r => r %> 
    <% end %> 
    <% end %> 
<% end %> 

para hacer este trabajo, Necesitará construir tantos objetos de revisión como requiera en su controlador:

def new 
    # you could also have this in a before_filter... 
    @user = User.find(params[:id]) 
    @reviews = Array.new(3) { @user.reviews.build } 
end 

Esto crearía nuevas instancias de registros de revisión para este usuario, que es diferente de registros nuevos. Las instancias son simplemente objetos Ruby. Ahora que ha llamado al @user.reviews.build tres veces, verá tres revisiones en su vista.

def create 
    @user = User.find(params[:id]) 

    @reviews = Review.create(params[:reviews]) 
    # Some more logic for validating the parameters passed in 
end 

Esto creará tres nuevos objetos Review y vincularlos a @user, suponiendo que los tres son válidos.

+1

Estoy algo confundido por su publicación. La página actual que publiqué es la # nueva página de opiniones, ¿entonces la def nueva en el controlador de las revisiones es a lo que llama "the_action" y del mismo modo, lo que sea, este es el def create en el controlador de reseñas? También donde pones 'render/form' ¿qué está en forma de renderizado? Actualmente,: url => reviews_path) me está dando un error de nombre. Gracias. – John

+3

qué sucede si no sabe cuántos registros se necesitan. ex. el usuario puede 'agregar nueva fila' al formulario para entradas adicionales. – turbo2oh

+2

Mire aquí para agregar una nueva fila: http://stackoverflow.com/questions/16919711/multiple-non-nested-model-creation-on-same-page/16920211#comment24427696_16920211 – MrYoshiji

6

Deberá indicarle a rails que es una matriz. En primer lugar, read this section of this article:

Para su propósito, que necesita para construir el formulario a mano:

<%= form_tag 'foo' do %> 
    <% [1,3,5].each do |i| %> 
    <%= text_field_tag 'review[][name]' %> 
    <%= text_field_tag 'review[][comment]' %> 
    <%= hidden_field_tag 'review[][rating]', :value => i %> 
    <% end %> 
<% end %> 
+0

OP debería usar fields_for con 'accept_nested_attributes_for' para esto. –

+1

Umm ... ¿Realmente importa? Esto logra lo mismo Y así es como lo hacen las guías Rails. ¿Realmente vale la pena un downvote cuando funcionará correctamente? – sethvargo

+0

He leído el artículo que ha vinculado y algunos otros, pero sigo teniendo problemas para que esto también funcione. La forma se está procesando correctamente, pero la parte 'foo' me está dando problemas. He reemplazado foo con user_review_path pero me está dando un error de enrutamiento? ¿Hay algo más que deba hacer en el nuevo o crear controladores o un archivo de enrutamiento? – John

Cuestiones relacionadas