Rails嵌套属性被复制

时间:2015-02-09 14:22:11

标签: ruby-on-rails ruby nested-attributes

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

当我创建新的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

output from employees/new

在我看来,@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。

1 个答案:

答案 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的说明。