2015-02-08 52 views
0

我已经在这里好几个小时了,但是找不到解决方案,现在想知道我是否正确地处理了这个问题。Rails以嵌套形式创建多个记录

我有一个employee窗体,并在其中创建多个ee_pay记录(它们存储对company_pay类型的引用)。问题是访问与我在表单中创建的ee_pay关联的company_pay

以下作品中的代码,但我一直在_pay_types.html.erb

获得第二@taxable_pays类型的描述在变量@description我不能完全肯定为什么发生这种情况。我已经尝试了多种方式来传递每一个的描述。我知道该集合中有两个,因为正确的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(更新)

我下面的代码马克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

“@ pay_types”集合的内容是什么?那个长度是2还是4?你的代码在语法上看起来是正确的,所以我会开始检查你的变量值,看看是什么导致了额外的迭代。你可以在你的控制器中使用'logger.info'来做一些原始的调试。 – 2015-02-08 23:04:14

+0

我调试过'@ pay_types',并且在终端显示有2个对象具有不同的引用'#'。我在这里把我的头撞到墙上。只是看不到'@ pay_types'中每个对象呈现两次的原因。会显示你生成的HTML是否有用? – 2015-02-08 23:14:59

+0

如果您删除'fields_for'标记,并尝试渲染没有表单字段的部分,那么您是否仍然会重复?如果仍然发生,尝试命名其他部分,看看它是否仍然存在? – 2015-02-08 23:41:10

回答

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部分,与ee_pay正在建造可使用<%= f.object.company_pay.description %>被访问,只要所有的关联被正确设置相关联的company_pay。很简单。

1

在上面给出的示例代码中,@description是控制器上的一个实例变量。看起来您正在迭代所有@taxable_pays对象并在该循环内分配@description,所以@description的值始终为最后一个应纳税所描述的值。

从概念上讲,它看起来像你正在尝试做正确的事情,但我认为你可能会让它变得比它需要的更复杂。它看起来像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 %> 

让我知道如果这不起作用,我们可以调整一些东西,直到找到解决特定问题的东西。

+0

是的我生成了多组表单字段,没有循环任何集合。我很困惑自己究竟是如何发生的,但我把它放在我的'employees_controller'中的代码中,在那里我有'@taxable_pays.each do | pt | pay_type = @ employee.ee_pay.build(company_pay_id:pt.id)'。我要给你的代码现在去 – 2015-02-08 08:22:02

+0

得到它与你的代码工作,但它每次新渲染每个'ee_pay'(类似于它以前为我做的,即它神奇地呈现两个新的ee_pay嵌套窗体没有我遍历任何东西)。所以现在我有4个嵌套记录。有任何想法吗?我自己也会一团糟。谢谢你的帮助。很多apprecaited – 2015-02-08 08:53:46

+0

编辑以前创建的窗体与这些多个嵌套记录时,我也挣扎。当我编辑一个嵌套记录时,它将复制加载并创建多个条目。 – 2015-02-08 10:04:51