Rails 3提交一个包含多个logging的表单

我是新手,所以这可能是一个基本的问题。 我正在尝试创build一个表单,用户可以一次创build3个logging。 我希望用户只需点击一次提交button。 我正在向“评论”模型提交名称,评论和评分。 目前,只有最后一条logging被input到数据库中。

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

任何意见表示赞赏。 谢谢。

我会build议使用fields_for为此:

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

要做到这一点,您需要在控制器中构build尽可能多的审查对象:

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

这将为此用户创build新的审阅logging实例 ,这与新logging不同。 实例只是Ruby对象。 现在,因为您已经调用了三次@user.reviews.build ,您将在视图中看到三条评论。

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

这将创build三个新的Review对象,并将它们链接到@user ,假设所有三个都是有效的。

你需要告诉rails它的一个数组。 首先, 阅读本文的这一部分 :

为了您的目的,您需要手动构build表单:

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