我已经在这几个小时了,但找不到解决方案,我现在想知道我是否正确接近这个。
我有一个employee
表单,其中我创建了多个ee_pay
记录(存储了对company_pay
类型的引用)。问题是访问与我在表单中创建的company_pay
相关联的ee_pay
。
以下代码有效,但我会在@taxable_pays
@description
中获取第二个_pay_types.html.erb
类型的说明
我不完全确定为什么会这样。我尝试了多种方法来传递每种方法的描述。我知道该集合中有两个,因为正确的ID存储在两个单独的ee_pay
记录中,这些记录在我提交表单时会被保存。
有人能告诉我如何将每个@taxable_pays.description
的值传递给视图吗?还告诉我,如果我以最好的方式接近这个?
谢谢你的期待。这是我的代码:
employees_controller.rb
我有一个执行以下操作的before_action:
@taxable_pays = CompanyPay.where(company_id: current_company.id).order(:id)
然后:
def new
@taxable_pays.each do |pt|
pay_type = @employee.ee_pay.build(company_pay_id: pt.id)
@description = pt.description
end
_form.html.erb
<div class="row">
<div class="col-md-4">
<div class="form_label"><strong>Description</strong></div>
</div>
<div class="col-md-4">
<div class="form_label"><strong>Amount</strong></div>
</div>
<div class="col-md-4">
<div class="form_label"><strong>Rate</strong></div>
</div>
<%= f.fields_for :ee_pay do |builder| %>
<%= render "pay_types", :f => builder %>
<% end %>
</div>
_pay_types.html.erb
<div class="col-md-4">
<div class="form_indent1"><div class="form_indent1"><%= @description %></div></div>
<div class="form_spacer"></div>
</div>
<div class="col-md-4">
<div class="form_indent1"><%= f.text_field :amount, class: "number_input" %></div>
<div class="form_spacer"></div>
</div>
<div class="col-md-4">
<div class="form_indent1"><%= f.text_field :rate, class: "number_input" %></div>
<div class="form_spacer"></div><br />
</div>
编辑1(已更新)
根据Mark G.的建议,我的代码现在看起来像: -
employees_controller.rb
@pay_types = []
@taxable_pays.each do |pt|
@pay_types << @employee.ee_pay.build(company_pay_id: pt.id)
puts "Debug for the pay_types"
puts @pay_types
end
_form.html.erb
<div>
<% @pay_types.each do |ee_pay| %>
<%= f.fields_for :ee_pay do |builder| %>
<%= render "pay_types", :f => builder, :ee_pay => ee_pay %>
<% end %>
<% end %>
</div>
_pay_types.html.erb
<%= f.hidden_field :company_pay_id %> (not on original edit)
<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"><%= f.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"><%= f.text_field :rate, class: "number_input" %></div>
<div class="form_spacer"></div><br />
</div>
我原本以为这是每次@pay_types打印两次,但再次查看它description
打印两次,每次都有company_pay_id
s
*description* *company_pay_id*
Basic 2
Basic 8
Time & 1/2 2
Time & 1/2 8
我真的很难过。
编辑2
这是我尝试创建新员工时获得的控制台输出
CompanyPay Load (0.7ms) SELECT "company_pays".* FROM "company_pays" WHERE "company_pays"."id" = $1 LIMIT 1 [["id", 2]]
Rendered employees/_pay_types.html.erb (2.8ms)
Debug in the _form view fields_for
#<EePay:0x007f4130a214a8>
Rendered employees/_pay_types.html.erb (0.5ms)
Debug in the _form view fields_for
#<EePay:0x007f4130a214a8>
CompanyPay Load (0.8ms) SELECT "company_pays".* FROM "company_pays" WHERE "company_pays"."id" = $1 LIMIT 1 [["id", 8]]
Rendered employees/_pay_types.html.erb (2.4ms)
Debug in the _form view fields_for
#<EePay:0x007f4130a1fcc0>
Rendered employees/_pay_types.html.erb (0.7ms)
Debug in the _form view fields_for
#<EePay:0x007f4130a1fcc0>
Rendered employees/_form.html.erb (37.5ms)
Rendered employees/new.html.erb within layouts/application (38.3ms)
我放弃了夜晚。一直在看它太长时间无处可去。谢谢您的帮助。明天再试一次
答案 0 :(得分:1)
在上面给出的示例代码中,@description
是控制器上的实例变量。看起来您正在迭代所有@taxable_pays
个对象并在该循环中分配@description
,因此@description
的值始终为 last 应税工资的描述是。
从概念上讲,看起来你正在尝试做正确的事情,但我认为你可能会让它变得比它需要的更复杂。看起来ee_pay
与CompanyPay
关联了吗?为什么不在您的_pay_types.html.erb
文件中,只是浏览您已建立的关联?
<div class="form_indent1"><%= ee_pay.company_pay.description %></div>
由于您的部分内容没有ee_pay
变量,因此您需要将其传递给_form.html.erb
中的部分变量。另外,如何在不绕过ee_pay
集合的情况下生成多组表单字段?我会想象它的工作方式(命名看起来有点令人困惑,但只是跟你所拥有的一样):
<强>控制器强>
def new
@pay_types = []
@taxable_pays.each do |pt|
@pay_types << @employee.ee_pay.build(company_pay_id: pt.id)
end
end
<强> _form.html.erb 强>
<% @pay_types.each do |ee_pay| %>
<%= f.fields_for :ee_pay do |builder| %>
<%= render "pay_types", :f => builder, :ee_pay => ee_pay %>
<% end %>
<% end %>
让我知道如果这不起作用,我们可以调整一些事情,直到你得到解决你的特定问题的东西。
答案 1 :(得分:0)
我使用Mark的方法绕过圈子,所以在stackoverflow上问了另一个问题,可以找到here。这可能会帮助其他人来到这里。
基本上,代码应该是: -
<强> employees_controller 强>
@taxable_pays.each do |tp|
@employee.ee_pay.build(company_pay_id: tp.id)
end
<强> _form 强>
<%= f.fields_for :ee_pay do |builder| %>
<%= render "pay_types", :f => builder %>
<% end %>
<强> _pay_types 强>
<div class="row">
<%= f.hidden_field :company_pay_id %>
<div class="col-md-2">
<div class="form_indent1"><div class="form_indent1"><%= f.object.company_pay.description %></div></div>
<div class="form_spacer"></div>
</div>
<div class="col-md-10">
<div class="col-md-4">
<div class="form_indent1"><%= f.text_field :rate, class: "number_input" %></div>
<div class="form_spacer"></div><br />
</div>
<div class="col-md-4">
<div class="form_indent1"><%= f.text_field :amount, class: "number_input" %></div>
<div class="form_spacer"></div>
</div>
</div>
</div>
请注意_pay_types
部分中,与company_pay
相关联的ee_pay
如何使用<%= f.object.company_pay.description %>
进行访问,只要所有关联都设置正确。很简单。