Rails 3提交一个包含多个记录的表单 [英] Rails 3 submit a form with multiple records
问题描述
我是新手,所以这可能是一个基本问题。我正在尝试创建一个表单,用户可以一次创建3条记录。我希望用户只需点击一次提交按钮。我向我的评论模型提交了名称,评论和评分。目前,只有最后一条记录被输入到数据库中。
<%= form_for([@ user,@ review]) do | f | %GT;
< table>
< tr>
< td> Rank< / td>
< td>名称< / td>
< td>评论< / 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.submitCreate my top 3%>
< / div>
<%end%>
任何建议表示赞赏。谢谢。
我建议使用 fields_for
p>
<%= form_for([@ user,:reviews])do | f | %GT;
<%@ reviews.each do | review | %GT;
<%= fields_for review do | r | %GT;
<%=呈现reviews / form,:r => r%>
<%end%>
<%end%>
<%end%>
要做到这一点,您需要在控制器中构建尽可能多的审阅对象:
def new
#你也可以在before_filter中找到这个...
@user = User .find(params [:id])
@reviews = Array.new(3){@ user.reviews.build}
end
这会为此用户创建新的实例的审阅记录,这与新的记录不同。实例只是Ruby对象。现在,因为您已三次调用 @ user.reviews.build
,您会在视图中看到三条评论。
($ params [:id])
@reviews = Review.create(params [:评论])
#验证传入参数的更多逻辑
end
这将创建三个新的 Review
对象,并将它们链接到 @user
,假设所有三个都是有效的。
I'm new to rails so this is probably a basic question. I am trying to create a form where the user can create 3 records at once. I want the user to only have to click the submit button once. I'm submitting to my Review model a name, comment, and rating. Currently, only the last record is entered into the database.
<%= 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 %>
Any advice is appreciated. Thanks.
I would recommend using fields_for
for this:
<%= form_for([@user, :reviews]) do |f| %>
<% @reviews.each do |review| %>
<%= fields_for review do |r| %>
<%= render "reviews/form", :r => r %>
<% end %>
<% end %>
<% end %>
To make this work, you will need to build as many review objects as you require in your controller:
def new
# you could also have this in a before_filter...
@user = User.find(params[:id])
@reviews = Array.new(3) { @user.reviews.build }
end
This would create new instances of review records for this user, which is different from new records. Instances are simply Ruby objects. Now because you've called @user.reviews.build
three times, you'll see three reviews in your view.
def create
@user = User.find(params[:id])
@reviews = Review.create(params[:reviews])
# Some more logic for validating the parameters passed in
end
This will create three new Review
objects and link them to @user
, assuming all three are valid.
这篇关于Rails 3提交一个包含多个记录的表单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!