NoMethodError с нулевым объектом - PullRequest
0 голосов
/ 15 апреля 2011

Привет, извините, если это глупый вопрос, правда, я новичок в мире ROR и пытаюсь учиться.

Я читаю книгу Agile Web Develpment с Rails и следую книжной программе, которую я получил с этой ошибкой:

NoMethodError в Line itemsController # create

У вас есть нулевой объект, когда вы этого не ожидали!Возможно, вы ожидали экземпляр Array.Произошла ошибка при оценке nil.

Это модель корзины

class Cart < ActiveRecord::Base
  has_many :line_items, :dependent => :destroy

  def add_product(product_id)
    current_item = line_items.where(:product_id => product_id).first
    if current_item
      current_item.quantity += 1
    else
      current_item = LineItem.new(:product_id => product_id)
      line_items << current_item
    end
    current_item
  end
end

И это контроллер строки, метод которого вызывается

  def create
    @cart = current_cart
    product = Product.find(params[:product_id])    
    @line_item = @cart.add_product(product.id)

    respond_to do |format|
      if @line_item.save
        format.html { redirect_to(@line_item.cart, :notice => 'Line item was successfully created.') }
        format.xml  { render :xml => @line_item.cart, :status => :created, :location => @line_item }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @line_item.errors, :status => :unprocessable_entity }
      end
    end
  end

Rails версия 3.0.5 Ruby версия 1.8.7

Есть предложения?ты видишь, что не так?Спасибо

Ответы [ 3 ]

2 голосов
/ 16 апреля 2011

Когда он сообщает об ошибке NoMethodError для объекта nil, это означает, что объект, для которого вы вызываете метод, не существует.Здесь может быть так, что либо @cart, либо @line_item не имеют данных, в зависимости от того, на каком номере строки произошла ошибка.Возможно, что

@cart = current_cart

... или ...

@line_item = @cart.add_product(product.id)

не возвращают действительный объект.Посмотрите на эти методы.

1 голос
/ 15 апреля 2011

Проблема в том, что объект, для которого вы вызываете метод, равен nil.В сообщении об ошибке должен быть указан номер строки, который должен указывать на строку кода, вызывающую ошибку.

Просто предположение, но может ли current_cart вернуть nil?Это было бы моей первой догадкой, но если бы вы могли выделить, какая строка была причиной ошибки, это было бы полезно.

0 голосов
/ 15 апреля 2011

NoMethodError означает, что вы вызываете метод, который не определен для экземпляра класса, для которого вы вызываете метод, в этом случае класс объекта, для которого вы пытаетесь вызвать метод, равен NilClass. Если вы не уверены, какой объект равен nil, вы всегда можете задать irb с помощью obj.class, хотя, как сказал другой ответчик, он должен указать, какая строка содержит ошибку (если не точный синтаксис).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...