为nil获取未定义的方法`values_at’:使用nested_form_for的NilClass

我正在使用ryanb的nested_form gem,它似乎没有正常工作。 删除链接不起作用(我正确安装了// = require jquery_nested_form,看起来它正在加载,但我不断收到此错误:

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  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 

我被困在相同的“未定义方法”错误中,并且在将f.fields_for调用的第一个参数更改为复数forms后,一切正常,就像has_many关联一样。 所以在你的情况下它应该是:

 = f.fields_for :invoice_line_items do |line_item| 

由于Invoice模型中的关联是has_many :invoice_line_items

希望它可以帮到某人。

看起来你有两个不同的问题。

1)删除链接不执行任何操作。 你使用的是什么版本的Rails? 资产管道直到3.1才被添加,因此如果您使用较低的资产,您可以按照“非资产管道设置”下的Github上的说明进行操作,这可能会解决问题1。

2)使用link_to_add帮助器会出错。 我偷看了这里的代码https://github.com/ryanb/nested_form/blob/master/lib/nested_form/builder_mixin.rb

该方法调用values_at

 @fields[fields_blueprint_id] 

根据你的错误信息,这显然是零。 我迷失了看Ryan的代码。 我没有看到这个值是如何设置的,所以我无法帮助你弄清楚为什么这个值为零。 但如果我不得不猜测,那是因为你没有添加

 attr_accessible :invoice_line_items_attributes 

到您的发票模型

这就是我想出的。 如果关系的嵌套方面没有项目 – 比如说,如果这本书没有作者 – 我得到了错误。 当我在控制器中加载@book时,我尝试检查authors数组是否为空,如果是,则添加一个新的空Author 。 当我这样做时,嵌套的表单从未看到空关系,并且错误消失了。

我怀疑这是一个可以用nested_form编码的问题,如果有人想这样做并提交拉取请求的话。