我是rails的新手,所以这可能是一个基本问题。我正在尝试创建一个表单,用户可以一次创建3条记录。我希望用户只需单击一次提交按钮。我正在向我的评论模型提交名称,评论和评级。目前,只有最后一条记录输入数据库。
<%= 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 %>
任何建议表示赞赏。感谢。
答案 0 :(得分:26)
我建议您使用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 %>
要使其工作,您需要在控制器中构建尽可能多的审阅对象:
def new
# you could also have this in a before_filter...
@user = User.find(params[:id])
@reviews = Array.new(3) { @user.reviews.build }
end
这将为此用户创建审核记录的新实例,这与新的记录不同。实例只是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
这将创建三个新的Review
个对象,并将它们链接到@user
,假设这三个对象都有效。
答案 1 :(得分:6)
你需要告诉rails它的数组。首先,read this section of this article:
出于您的目的,您需要手动构建表单:
<%= 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 %>