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_pay
为builder
): –
但这给了我错误: –
undefined method `company_pay' for #
对我而言,我似乎无法访问正在创建的ee_pay
的company_pay
。 任何想法?
编辑2 – 解决
在进行了Yan Foto建议的编辑后,我可以访问使用builder.object.company_pay.description
创建的ee_pay
的company_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
的描述。