Rails的嵌套属性被复制(Rails Nested attributes being duplic

2019-10-21 19:24发布

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

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

晏提出的意见改变employee_controller

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

和在去掉迭代@ee_pay_types在视图,其现在看起来像(I改变任何参考ee_paybuilder ): -

    <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中的ee_pay创建。 任何人任何想法?

编辑2 -解决

让严图片建议的修改之后,我那时能够访问company_pay中的ee_pay使用创建builder.object.company_pay.description 。 再次感谢严。

Answer 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| %> <% @ee_pay_types.each do |ee_pay| %>从表单,你是好去。

更新 你也想访问CompanyPay形式:

builder.object ,您可以访问窗体对象( EePay实例)并调用builder.object.company_pay.description为您提供了相关的说明CompanyPay



文章来源: Rails Nested attributes being duplicated