Rails 3 提交包含多条记录的表单 [英] Rails 3 submit a form with multiple records
问题描述
我是 Rails 新手,所以这可能是一个基本问题.我正在尝试创建一个表单,用户可以在其中一次创建 3 条记录.我希望用户只需单击一次提交按钮.我正在向我的评论模型提交名称、评论和评级.目前,只有最后一条记录被输入到数据库中.
<%= form_for([@user,@review]) do |f|%><表格><tr><td>排名</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><div class="actions"><%= f.submit "创建我的前 3 个"%>
<%结束%>
任何建议表示赞赏.谢谢.
为此我建议使用 fields_for
:
<%= form_for([@user, :reviews]) do |f|%><% @reviews.each 做 |review|%><%= fields_for review do |r|%><%= 呈现评论/表单",:r =>%><%结束%><%结束%><%结束%>
要完成这项工作,您需要在控制器中构建所需数量的评论对象:
def new# 你也可以在 before_filter 中使用它...@user = User.find(params[:id])@reviews = Array.new(3) { @user.reviews.build }结尾
这将为该用户创建新的评论记录实例,这与新的记录不同.实例只是 Ruby 对象.现在,因为您已调用 @user.reviews.build
三次,您将在视图中看到三条评论.
def 创建@user = User.find(params[:id])@reviews = Review.create(params[:reviews])# 验证传入参数的更多逻辑结尾
这将创建三个新的 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屋!