Rails 3提交一份包含多条记录的表格

Joh*_*ohn 16 forms ruby-on-rails ruby-on-rails-3

我是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 %>
Run Code Online (Sandbox Code Playgroud)

任何建议表示赞赏.谢谢.

Rya*_*igg 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 %>
Run Code Online (Sandbox Code Playgroud)

要使其工作,您需要在控制器中构建所需数量的审阅对象:

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

这将为该用户创建新的审阅记录实例,这与新记录不同.实例只是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
Run Code Online (Sandbox Code Playgroud)

这将创建三个新Review对象并将它们链接到@user,假设这三个对象都有效.

  • 如果你不知道需要多少记录怎么办?恩.用户可以在表单中"添加新行"以获取其他条目. (3认同)
  • 看看这里添加一个新行:http://stackoverflow.com/questions/16919711/multiple-non-nested-model-creation-on-same-page/16920211#comment24427696_16920211 (2认同)

set*_*rgo 6

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

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

<%= 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 %>
Run Code Online (Sandbox Code Playgroud)