Rails multi-record form only saves parameters for

2019-07-27 17:42发布

I'm trying to offer teachers a form that will create multiple students at once. It seems that most people tackle this concept with nested attributes, but I'm having a hard time understanding how that would work when I'm only using a single model. This article made it seem possible to achieve this without nested attributes, but my results are not working the way the author suggests. The students array should include one hash for each section of the form. But when I submit the form and check the parameters, only one single hash exists in the array.

Adjusting her approach, I've got this controller:

students_controller.rb

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

(I'm using an action I've called "multi" because it's a different view than the regular "create" action, which only creates one student at a time. I've tried moving everything into the regular create action, but I get the same results.)

The view:

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 %>

The results:

(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>

Only one has is included for a student named "fff ggg". There should be four other hashes with different students.

Thank you in advance for any insight.

1条回答
我命由我不由天
2楼-- · 2019-07-27 18:03

fields_for is only used in conjunction with form_for. The for is referring to a model, which it expects you to use. Since you're trying to build a form with no model, you have to construct your own input field names.

Don't use fields_for but instead, render each input using the form tag helpers e.g.

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

...and so on.

The key is that the field names have that [] in them to indicate that the students parameters will be an array of hashes. You almost got it by telling fields_for to be called students[] but fields_for ignored it because it needs a model to work correctly.

查看更多
登录 后发表回答