tag select_tag rails options_from_collection_for_select options_for_select example collection ruby-on-rails forms ruby-on-rails-3

ruby on rails - select_tag - Rails 3 envía un formulario con múltiples registros.



select_tag default value (2)

Soy nuevo en los rieles, así que esta es probablemente una pregunta básica. Estoy intentando crear un formulario donde el usuario puede 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.

<%= 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.


Recomendaría 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 que esto funcione, deberá crear tantos objetos de revisión como necesite 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 los registros nuevos. Las instancias son simplemente objetos de rubí. Ahora porque ha llamado a @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 de Review y los vinculará a @user , asumiendo que los tres son válidos.


Tendrás que decirle a Rails que es una matriz. Primero, lea esta sección de este artículo :

Para tu propósito, necesitarás 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 %>