2013-04-03 77 views
3

我正在使用ryanb的nested_form gem,它似乎沒有正常工作。刪除鏈接無法正常工作(我安裝正確// =需要jquery_nested_form,它看起來像它的加載,但我不斷收到此錯誤:使用nested_form_for獲取未定義的方法`values_at'for nil:NilClass使用nested_form_for

undefined method `values_at' for nil:NilClass 

,當我去補充:

= f.link_to_add "Add a line item", :invoice_line_items 

同樣,沒有該行它的工作原理,但刪除鏈接不會做任何事情:

line_item.link_to_remove "Remove this line item" 

這裏是我的代碼:

.row-fluid 
    .span10.offset1 
    = nested_form_for(@invoice) do |f| 
     - if @invoice.errors.any? 
     #error_explanation 
      %h2 
      = pluralize(@invoice.errors.count, "error") 
      prohibited this invoice from being saved: 
      %ul 
      - @invoice.errors.full_messages.each do |msg| 
       %li= msg 
     .fieldset 
     %legend 
      = "New Invoice for #{@client.name}" 
     .form-horizontal 
      .pull-left 
      .control-group 
       %label.control-label{:style => "width: 100px;"} 
       Invoice ID 
       .controls{:style => "margin-left: 120px;"} 
       = f.text_field :client_invoice_id, :class => "input-small", :placeholder => @invoice_count_placeholder 
      .control-group 
       %label.control-label{:style => "width: 100px;"} 
       Due Date 
       .controls{:style => "margin-left: 120px;"} 
       = f.select :payment_term, @payment_terms, { :required => "true" }, { :class => "span10" } 
      .pull-right 
      .control-group 
       %label.control-label 
       Issue Date 
       .controls{:style => "margin-right: 60px;"} 
       = f.text_field :issue_date, :id => "date-picker", :class => "input-small", :required => "true" 
      .control-group 
       %label.control-label 
       Discount 
       .controls{:style => "margin-right: 60px;"} 
       .input-append 
        = f.text_field :discount, :class => "input-small", :placeholder => "Optional" 
        %span.add-on % 
     .row-fluid 
      %table.table 
      = f.fields_for :invoice_line_item do |line_item| 
       %tr 
       %th 
       %th.span8 Description 
       %th.span1 Quantity 
       %th.span1 Rate 
       %th.span1 Amount 
       %tr 
       %td= line_item.link_to_remove "Remove this line item" 
       %td= line_item.text_field :description 
       /%td= text_area_tag 'body', nil, :style => "width:96%;" 
       %td= text_field_tag 'hello', nil, :class => "input-mini" 
       %td= text_field_tag 'hello', nil, :class => "input-mini" 
       %td $99.99 

      = f.link_to_add "Add a line item", :invoice_line_items 
     .form-actions 
      = f.submit "Preview Invoice", :class => "btn btn-primary pull-right" 

任何想法我做錯了什麼?我希望輕鬆地將訂單項添加到發票中,然後保存所有內容。這裏是我的協會:

class Invoice < ActiveRecord::Base 
    ## ASSOCIATIONS ## 
    belongs_to :user 
    belongs_to :client 
    has_many :invoice_line_items 
    ## NESTED ATTRIBUTES ## 
    accepts_nested_attributes_for :invoice_line_items, :allow_destroy => true 

class InvoiceLineItem < ActiveRecord::Base 
    ## ASSOCIATIONS ## 
    belongs_to :invoice 

編輯:這裏是我的發票控制器新動作:

def new 
    @client = current_user.clients.find(params[:client_id]) 
    @invoice = Invoice.new(:client_id => @client.id) 
    @payment_terms = Invoice.payment_terms 

    if @client.invoices.count > 0 
     @invoice_count_placeholder = "Last used: #{@client.invoices.last.client_invoice_id}" 
    else 
     @invoice_count_placeholder = "" 
    end 

    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render json: @invoice } 
    end 
    end 
+0

我有這個相同的問題。我有另外一種模式,在這種模式下工作...但我現在試圖設置的模式不適用。 – pjmorse

+0

我發現':invoice_line_items'必須是** fields_for **和** link_to_add **中的複數** – Abhi

回答

0

它看起來就像你有兩個不同的問題。

1)刪除鏈接不做任何事情。你使用的是什麼版本的Rails?資產管道直到3.1才被添加,所以如果你使用的是較低的東西,你可以按照Github的「非資產管道設置」中的說明解決問題。

2)使用link_to_add助手會給你一個錯誤。我在偷看代碼這裏https://github.com/ryanb/nested_form/blob/master/lib/nested_form/builder_mixin.rb

的方法調用values_at上

@fields[fields_blueprint_id] 

其中,根據您的錯誤信息,是apperently爲零。我迷失了看Ryan的代碼。我不明白這個值是如何設定的,所以我無法幫助你弄清楚爲什麼這個值是零。但如果要我猜,那是因爲你沒有添加

attr_accessible :invoice_line_items_attributes 

你的發票模型

+0

使用Rails 3.2,我遇到了這個問題,並且'attr_accessible'設置正確。不過,感謝您指出來源。奇怪... – pjmorse

0

這是我想出了。如果在關係的嵌套方面沒有項目 - 比方說,如果這本書沒有作者 - 我得到了錯誤。當我在控制器中加載@book時,我嘗試檢查authors數組是否爲空,並且如果是,則添加一個新的空Author。當我這樣做時,嵌套表單從來沒有看到一個空的關係,並且錯誤消失了。

我懷疑這是一個可能被編碼出nested_form如果有人想要這樣做,並提交拉請求的問題。

+0

N.B. 「書」和「作者」的例子關聯被想象爲這個答案。 – pjmorse

1

我被卡在了同一個「未定義的方法」的錯誤和一切運行良好後,我改變了f.fields_for調用的第一個參數複數形式,就像的has_many關聯。所以你的情況應該是:

= f.fields_for :invoice_line_items do |line_item| 

因爲在發票模型的關聯是has_many :invoice_line_items

希望它可以幫助別人。

相關問題