Rails以嵌套形式创建多个记录

时间:2015-02-08 00:16:33

标签: ruby-on-rails ruby

我已经在这几个小时了,但找不到解决方案,我现在想知道我是否正确接近这个。

我有一个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)

我放弃了夜晚。一直在看它太长时间无处可去。谢谢您的帮助。明天再试一次

2 个答案:

答案 0 :(得分:1)

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

从概念上讲,看起来你正在尝试做正确的事情,但我认为你可能会让它变得比它需要的更复杂。看起来ee_payCompanyPay关联了吗?为什么不在您的_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 %>进行访问,只要所有关联都设置正确。很简单。