在购物车中获取零对象

时间:2009-09-14 08:39:32

标签: ruby-on-rails shopping-cart

我在rails中创建一个简单的购物车,当我将产品添加到购物车时,我收到此错误: 当你没想到它时,你有一个零对象!

添加到购物车的方法是:

  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这发生了......

3 个答案:

答案 0 :(得分:0)

也许begin开始一个新的范围,以便产品var是本地的。 然后,当您在救援区中添加产品时,它是Nil的新本地。

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

答案 1 :(得分: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}"在查找后立即找出产品中的内容。

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

答案 2 :(得分:0)

如何定义add_product方法中的@items?我在任何地方都看不到它,是吗?