Rails嵌套属性被复制

这个问题打败了我。 我整个周末一直在这里,但无法弄清楚发生了什么。

当我创建一个新的employee对象时,我accepts_nested_attributes_for :ee_pay在我的employee模型中使用accepts_nested_attributes_for :ee_pay创建多个新的ee_pay记录。

为新员工创建ee_pay记录取决于员工所属公司的company_pay对象数量。 所以在下面的例子中有2个company_pay对象 – >“Basic”[id:2]和“Time + 1/2”[id:3](在before_action返回)并且我想为每个对象创建一个ee_pay有问题的员工

这是代码: –

employees_controller.rb

  before_action :set_company_pay_types, only: [:new, :update, :edit] def new @ee_pay_types = [] @taxable_pays.each do |pt| @ee_pay_types << @employee.ee_pay.build(company_pay_id: pt.id) end end private def set_company_pay_types @taxable_pays = CompanyPay.where(['company_id = ? AND pay_sub_head_id = ? AND description  ?', current_company.id, 1, "Salary"]).order(:id) end def employee_params params.require(:employee).permit(....[multiple other fields]..., address_attributes:[:id, :line1, :line2, :line3, :line4, :postcode, :country], ee_pay_attributes:[:id, :employee_id, :company_pay_id, :amount, :rate]) end 

意见/员工/ _form

 
Hourly Pay Types
Description
Amount
Units
Rate

员工/新员工的输出

当我去创建一个新的员工记录时,我得到了ee_pay对象的以下输出。 事实certificate,代码是以下列格式复制每一个: –

 *description* *company_pay_id* Basic 2 Basic 3 Time & 1/2 2 Time & 1/2 3 

员工/新员工的输出

在我看来,在@ee_pay_types << @employee.ee_pay.build(company_pay_id: pt.id)这一行正在构建两个新的ee_pay对象(在上图中的调试中输出)。 然后在视图中,它迭代这两个并为每个创建两个新的ee_pay对象。 我认为这是正在发生的事情,但我可能完全绞尽脑汁。 我在这个阶段迷路了,我不知道如何解决它。

希望有人能指出我如何解决它的正确方向。 这可能是我很遗憾的事情。

谢谢你的期待

编辑1

根据要求添加模型

车型/ ee_pay

  class EePay < ActiveRecord::Base belongs_to :employee belongs_to :company_pay end 

模型/ company_pay

  class CompanyPay < ActiveRecord::Base belongs_to :pay_sub_head belongs_to :company has_many :ee_pay end 

模型/员工

  class Employee < ActiveRecord::Base belongs_to :company belongs_to :address accepts_nested_attributes_for :address has_many :ee_pay accepts_nested_attributes_for :ee_pay end 

Yann在评论中建议将employee_controller更改为this

  @ee_pay_types = [] @taxable_pays.each do |pt| @employee.ee_pay.build(company_pay_id: pt.id) end 

并删除视图中的@ee_pay_types的迭代,现在看起来像(我ee_pay任何引用ee_paybuilder ): –

  

但这给了我错误: –

 undefined method `company_pay' for # 

对我而言,我似乎无法访问正在创建的ee_paycompany_pay 。 任何想法?

编辑2 – 解决

在进行了Yan Foto建议的编辑后,我可以访问使用builder.object.company_pay.description创建的ee_paycompany_pay 。 再次感谢严。

您不需要在fields_for之前进行迭代,因为它会为现有关联的数量呈现您的表单。 您可以通过将@taxable_pays的数量@taxable_pays为3来确认这一点,并查看如何在表单中获得9(而不是6)项。

将您的控制器更改为以下内容:

 def new @ee_pay_types = [] @taxable_pays.each do |pt| @employee.ee_pay.build(company_pay_id: pt.id) end end 

并删除<% @ee_pay_types.each do |ee_pay| %> 从你的表单中获得<% @ee_pay_types.each do |ee_pay| %>你很高兴。

更新 您还希望以下列forms访问CompanyPay

builder.object允许您访问表单对象( EePay实例)并调用builder.object.company_pay.description为您提供关联的CompanyPay的描述。