Rails通过表单提交多个Has_Many属性

时间:2017-05-17 20:30:52

标签: ruby-on-rails forms

我正在运行带有以下信息的Rails 5.1应用程序:

模型

class Company < ApplicationRecord
  has_many :complaints
  accepts_nested_attributes_for :complaints
  validates :name, presence: true
end

class Complaint < ApplicationRecord
  belongs_to :company
  validates :username, :priority, presence: true
end

控制器

class ComplaintController < ApplicationController

  def new
    @company = Company.new
    @company.complaints.build
  end

  def create
    @company = Company.new(company_params)
    respond_to do |format|
      if @company.save
        format.html { redirect_to complaint_url }
      else
        format.html { render :new }
      end
    end
  end

  private

    def company_params
      params.require(:company).permit(:name, complaints_attributes: [:username, :priority])
    end

视野中的表格

<%= form_for @company do |f| %>

  <%= f.label :name, "Company" %>
  <%= f.text_field :name, type: "text" %>

  <%= f.fields_for :complaints do |complaint| %>

    <%= complaint.label :username, "Username" %>
    <%= complaint.text_field :username %>

    <%= complaint.label :priority, "Priority" %>
    <%= complaint.text_field :priority %>

  <% end %>
  <%= f.submit 'Submit' %>
<% end %>

如果我只有一个输入字段用于表单的complaint_attributes部分(换句话说,只有一个字段用于用户名,一个字段用于优先级,如上所示),这样就可以了。

但是,如果我想在表单中有多个用户名/优先级字段,以便我可以在一次提交中提交多个用户名/优先级组合,我发现提交表单只会保存最后的用户名/优先级值从形式。此视图的示例如下:

<%= form_for @company do |f| %>

  <%= f.label :name, "Company" %>
  <%= f.text_field :name, type: "text" %>

  <%= f.fields_for :complaints do |complaint| %>

    <div>
      <%= complaint.label :username, "Username" %>
      <%= complaint.text_field :username %>

      <%= complaint.label :priority, "Priority" %>
      <%= complaint.text_field :priority %>
    </div>

    <div>
      <%= complaint.label :username, "Username" %>
      <%= complaint.text_field :username %>

      <%= complaint.label :priority, "Priority" %>
      <%= complaint.text_field :priority %>
    </div>

  <% end %>
  <%= f.submit 'Submit' %>
<% end %>

我注意到在提交表单时,我得到了这样的哈希(用于提交单个投诉):

{"utf8"=>"✓", "authenticity_token"=>"...", "company"=>{"name"=>"Test", "complaints_attributes"=>{"0"=>{"username"=>"test_person", "priority"=>"1"}}}, "commit"=>"Submit"}

有没有办法修改params使其与此类似并将其保存到数据库中?:

{"utf8"=>"✓", "authenticity_token"=>"...", "company"=>{"name"=>"Test", "complaints_attributes"=>{"0"=>{"username"=>"test_person", "priority"=>"1"}"1"=>{"username"=>"test_person", "priority"=>"2"}}}, "commit"=>"Submit"}

如果不是上述内容,如果在单个表单中使用多个字段,那么保存用户名/优先级值的最佳方法是什么?

编辑:我应该指出,我可以根据需要动态添加用户名/优先级字段组,因此我不希望被限制为一组数字。

1 个答案:

答案 0 :(得分:0)

第二个块将覆盖第一个字段......您应该在控制器中构建许多投诉:

def new
  @company = Company.new
  3.times { @company.complaints.build }
end

然后使用以下表单,它应根据您构建的投诉数量生成输入:

<%= form_for @company do |f| %>

  <%= f.label :name, "Company" %>
  <%= f.text_field :name, type: "text" %>

  <%= f.fields_for :complaints do |complaint| %>

    <%= complaint.label :username, "Username" %>
    <%= complaint.text_field :username %>

    <%= complaint.label :priority, "Priority" %>
    <%= complaint.text_field :priority %>

  <% end %>
  <%= f.submit 'Submit' %>
<% end %>