【问题标题】:Rails multi-record form only saves parameters for last recordRails 多记录表单只保存最后一条记录的参数
【发布时间】:2016-08-18 21:22:47
【问题描述】:

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

调整她的方法,我得到了这个控制器:

students_controller.rb

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

(我使用了一个我称之为“multi”的动作,因为它与常规的“create”动作不同,后者一次只创建一个学生。我尝试将所有内容都移到常规的 create 动作中,但我得到了相同的结果。)

观点:

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>

只包含一个名为“fff ggg”的学生。应该有其他四个不同学生的哈希值。

提前感谢您的任何见解。

【问题讨论】:

    标签: ruby-on-rails ruby forms parameters


    【解决方案1】:

    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 忽略了它,因为它需要一个模型才能正常工作。

    【讨论】:

    • 这行得通。谢谢你。如果您不介意,我不熟悉双下划线语法。如“学生__first_name”。你知道这叫什么吗,所以我可以阅读更多?
    • 这只是 Rails 将文本字段 "students[][first_name]" 的输入名称转换为其 id 的方式。使用sanitize_to_id 方法。标签应该有一个for 属性来指定它们用于哪个输入ID(以便单击标签将光标焦点放在输入上)。因此,label_tag 的第一个参数是text_field_tag 的第一个参数的净化 id 版本,我们必须这样做,因为常规表单标签助手不会为您这样做。
    • 优秀。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多