Rails 3 提交包含多条记录的表单 [英] Rails 3 submit a form with multiple records

查看:19
本文介绍了Rails 3 提交包含多条记录的表单的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆