我正在运行带有以下信息的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"}
如果不是上述内容,如果在单个表单中使用多个字段,那么保存用户名/优先级值的最佳方法是什么?
编辑:我应该指出,我可以根据需要动态添加用户名/优先级字段组,因此我不希望被限制为一组数字。
答案 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 %>