【问题标题】:getting nil object in shopping cart在购物车中获取 nil 对象
【发布时间】:2009-09-14 08:39:32
【问题描述】:

我正在 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 时发生这种情况......

【问题讨论】:

    标签: ruby-on-rails shopping-cart


    【解决方案1】:

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

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

    【讨论】:

    • 要么就是这样,要么@cart 为nil,因为find_cart 方法发现nil。在这两个建议之间,您应该能够弄清楚。 Ruby 调试器可能会有所帮助:guides.rubyonrails.org/…
    【解决方案2】:

    我猜这不是范围问题,正如以下 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 或您视图中引用的东西。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2017-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-02
        • 2014-04-10
        • 1970-01-01
        相关资源
        最近更新 更多