0

我正在 Rails 中创建一个简单的购物车,当我将产品添加到购物车时出现此错误:当您没有预料到它时,您有一个 nil 对象!

添加到购物车的方法是:

  def add_to_cart  
    begin
      product = Product.find(params[:id])
    rescue ActiveRecord::RecordNotFound
      logger.error("Attemp to access invalid product #{params[:id]}")
      flash[:notice] = "Invalid Product !"
      redirect_to :action => :index
    else
      @cart = find_cart     
      @cart.add_product(product)
    end
  end

和购物车中的 add_product :

  def add_product(product)
    current_item = @items.find {|item| item.product == product}
    if current_item
      current_item.increment_quantity
    else
      @items << CartItem.new(product)
    end    
  end

购物车工作正常,当我将救援方法添加到 add_to_cart 时,发生了这种情况......

4

3 回答 3

0

也许 begin 开始了一个新的范围,以便产品 var 是它的本地变量。然后,当您将产品添加到救援块中时,它是一个带有 Nil 的新本地。

要测试这个理论,只需product = nil在整个开始之前添加一个救援代码块

于 2009-09-14T08:52:19.203 回答
0

add_product 方法中的@items 是如何定义的?我哪里都看不到,是吗?

于 2009-09-17T12:32:21.037 回答
0

我猜这不是范围问题,正如以下 irb 测试所示:

irb(main):001:0> begin
irb(main):002:1* product = 'abc'
irb(main):003:1> rescue Exception => ex
irb(main):004:1> nil
irb(main):005:1> else
irb(main):006:1* puts product.inspect
irb(main):007:1> end

解决这个问题的最好方法,IMO,是使用LOGGER.debug "product now contains #{product.inspect}".

您的回溯也将提供信息。在这一点上,很难说出口译员在抱怨什么。产品可能是 nil,但同样容易,它可能是 @cart 或您认为引用的东西。

于 2009-09-14T21:02:34.077 回答