Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting undefined method `values_at' for nil:NilClass using nested_form_for

I'm using nested_form gem from ryanb and it doesn't seem to be working properly. The remove link doesn't work (I installed the //= require jquery_nested_form properly and it looks like it's loading but i keep getting this error:

undefined method `values_at' for nil:NilClass

when i go to add:

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

also, without that line it works but the remove link doesn't do anything:

line_item.link_to_remove "Remove this line item"

here's my code:

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

any idea what i'm doing wrong? I want to easily be able to add line items to the invoice and then save the whole thing. Here's my associations:

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

EDIT: here's my invoices controller new action:

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
like image 347
Matthew Berman Avatar asked Aug 07 '26 09:08

Matthew Berman


1 Answers

I was stuck in the same "undefined method" error and everything worked fine after I changed the first parameter of the f.fields_for call to the plural form, just like the has_many association. So in your case it should be:

= f.fields_for :invoice_line_items do |line_item|

since the association in the Invoice model is has_many :invoice_line_items

Hope it helps someone.

like image 104
Victor BV Avatar answered Aug 09 '26 23:08

Victor BV



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!