这个问题打败了我。我整个周末一直在这里,但无法弄清楚发生了什么。
当我创建新的employee
对象时,我还希望在ee_pay
模型中使用accepts_nested_attributes_for :ee_pay
创建多个新的employee
记录。
为新员工创建ee_pay
条记录取决于员工所属公司的company_pay
个对象的数量。所以在下面的例子中有2个company_pay
个对象 - > “基本”[id:2]和“时间+ 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
<div><strong>Hourly Pay Types</strong></div>
<div class="form_spacer"></div>
<div class="row">
<div class="col-md-3">
<div class="form_indent1"><div class="form_label"><strong>Description</strong></div></div>
</div>
<div class="col-md-3">
<div class="form_indent1"><div class="form_label"><strong>Amount</strong></div></div>
</div>
<div class="col-md-2">
<div class="form_indent1"><div class="form_label"><strong>Units</strong></div></div>
</div>
<div class="col-md-4">
<div class="form_indent1"><div class="form_label"><strong>Rate</strong></div></div>
</div>
<div>
<%= debug @ee_pay_types %>
<% @ee_pay_types.each do |ee_pay| %>
<%= f.fields_for :ee_pay do |builder| %>
<%= builder.hidden_field :company_pay_id %>
<div class="col-md-3">
<div class="form_indent1"><div class="form_indent1"><%= ee_pay.company_pay.description %></div></div>
<div class="form_spacer"></div>
</div>
<div class="col-md-3">
<div class="form_indent1"><%= builder.text_field :amount, class: "number_input" %></div>
<div class="form_spacer"></div>
</div>
<div class="col-md-2">
<div class="form_indent1"><%= ee_pay.company_pay.units %></div>
<div class="form_spacer"></div>
</div>
<div class="col-md-4">
<div class="form_indent1"><%= builder.text_field :rate, class: "number_input" %></div>
<div class="form_spacer"></div><br />
</div>
<% end %>
<% end %>
</div>
</div>
员工输出/新
当我去创建一个新的员工记录时,我得到ee_pay
个对象的以下输出。事实证明,代码以下列格式复制每一个: -
*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)
中的这一行employees_controller
正在构建两个新的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
更改为此
@ee_pay_types = []
@taxable_pays.each do |pt|
@employee.ee_pay.build(company_pay_id: pt.id)
end
并删除视图中的@ee_pay_types
上的迭代,现在看起来像(我将对ee_pay
的任何引用更改为builder
): -
<div>
<%= debug @ee_pay_types %>
<%= f.fields_for :ee_pay do |builder| %>
<%= builder.hidden_field :company_pay_id %>
<div class="col-md-3">
<div class="form_indent1"><div class="form_indent1"><%= builder.company_pay.description %></div></div>
<div class="form_spacer"></div>
</div>
<div class="col-md-3">
<div class="form_indent1"><%= builder.text_field :amount, class: "number_input" %></div>
<div class="form_spacer"></div>
</div>
<div class="col-md-2">
<div class="form_indent1"><%= builder.company_pay.units %></div>
<div class="form_spacer"></div>
</div>
<div class="col-md-4">
<div class="form_indent1"><%= builder.text_field :rate, class: "number_input" %></div>
<div class="form_spacer"></div><br />
</div>
<% end %>
</div>
但这给了我错误: -
undefined method `company_pay' for #<ActionView::Helpers::FormBuilder:0x007f47d5649118>
对我而言,我似乎无法访问正在创建的company_pay
的{{1}}。任何想法?
编辑2 - 已解决
在进行Yan Foto建议的编辑后,我可以使用ee_pay
访问正在创建的company_pay
的{{1}}。再次感谢Yan。
答案 0 :(得分:1)
您不需要在fields_for
之前进行迭代,因为它会根据现有关联的数量呈现您的表单。您可以通过将@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| %>
,您就可以了。
<强>更新强>
您还希望以以下格式访问CompanyPay
:
builder.object
可让您访问表单对象(EePay
实例),并且调用builder.object.company_pay.description
可为您提供相关CompanyPay
的说明。