Rails多记录表单仅保存最后记录的参数

时间:2016-08-18 21:22:48

标签: ruby-on-rails ruby forms parameters

我试图为教师提供一个可以同时创建多个学生的表格。似乎大多数人都使用嵌套属性来处理这个概念,但是当我只使用单个模型时,我很难理解它是如何工作的。 This article似乎可以在没有嵌套属性的情况下实现这一点,但我的结果并不像作者所建议的那样工作。学生数组应该为表单的每个部分包含一个哈希。但是当我提交表单并检查参数时,数组中只存在一个哈希值。

调整她的方法,我有这个控制器:

students_controller.rb

  def multi
    @student_group = []
    5.times do
      @student_group << Student.new
    end
  end

(我正在使用我称之为&#34;多&#34的操作;因为它与常规&#34;创建&#34;操作不同,只会创建一次一个学生。我已经尝试将所有内容都移到常规创建操作中,但我得到的结果相同。)

观点:

multi.html.erb

<%= form_tag students_path do %>
  <% @student_group.each do |student| %>
    <%= fields_for 'students[]', student do |s| %>

      <div class="field">
        <%= s.label :first_name %><br>
        <%= s.text_field :first_name %>
      </div>
      <div class="field">
        <%= s.label :last_name %><br>
        <%= s.text_field :last_name %>
      </div>

    <% end %>
  <% end %>
  <div class="actions">
    <%= submit_tag %>
  </div>
<% end %>

结果:

(byebug) params

<ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"3Xpi4XeqXuPs9jQvevy+nvGB1HiProddZzWq6Ed7Oljr3TR2fhx9Js6fN/F9xYcpgfDckCBOC2CoN+MrlFU0Bg==", "students"=>{"first_name"=>"fff", "last_name"=>"ggg"}, "commit"=>"Save changes", "controller"=>"students", "action"=>"create"} permitted: false>

名为&#34; fff ggg&#34;的学生只包括一个。应该有四个不同学生的其他哈希。

提前感谢您的任何见解。

1 个答案:

答案 0 :(得分:2)

fields_for仅与form_for一起使用。 for指的是一个模型,它希望您使用它。由于您正在尝试构建没有模型的表单,因此必须构建自己的输入字段名称。

请勿使用fields_for,而是使用表单标记帮助器呈现每个输入,例如

<%= label_tag "students__first_name", "First Name" %>
<%= text_field_tag "students[][first_name]" %>

......等等。

关键是字段名称中包含[],表示学生参数将是一个哈希数组。你差不多通过告诉fields_for被称为students[]fields_for忽略了它,因为它需要一个模型才能正常工作。