получение нулевого объекта в корзине - PullRequest
0 голосов
/ 14 сентября 2009

Я создаю простую корзину в рельсах, когда я добавляю продукт в корзину, я получаю эту ошибку: У вас есть нулевой объект, когда вы этого не ожидали!

метод добавления в корзину:

  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 голосов
/ 15 сентября 2009

Я собираюсь догадаться, что это не проблема области видимости, как показывает следующий тест 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

Лучший способ выяснить это, ИМО, - это выяснить, что находится в продукте сразу после поиска, используя LOGGER.debug "product now contains #{product.inspect}".

Ваш обратный след также будет информационным. На данный момент сложно сказать, на что жалуется переводчик. Возможно, этот продукт равен нулю, но с такой же легкостью это может быть @cart или что-то, на что вы ссылаетесь.

0 голосов
/ 17 сентября 2009

Как определяется @items в вашем методе add_product? Я нигде не вижу, это так?

0 голосов
/ 14 сентября 2009

Может быть, начало начинает новую область видимости, так что var продукта является локальным для него. И когда вы добавляете продукт в блок восстановления, это новый локальный узел с нулем.

Чтобы проверить эту теорию, просто добавьте product = nil до начала всего процесса, спасите блок кода

...