2009-09-14 13 views
0

Je crée un simple panier dans les rails, quand j'ajoute le produit au panier J'ai cette erreur: Vous avez un objet nul quand vous ne l'attendiez pas!Objets nil dans le panier

l'ajouter à la méthode de panier est:

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 

et le add_product dans le panier:

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 

le chariot fonctionnait correctement, quand j'ajoute la méthode de sauvetage pour add_to_cart cela est arrivé ...

Répondre

0

Peut-être que le début commence une nouvelle portée de sorte que le produit var soit local. Et quand vous ajoutez ensuite le produit dans le bloc de secours, c'est un nouveau local avec Nil.

Pour tester cette théorie il suffit d'ajouter un product = nil avant tout le début, le bloc de sauvetage code

+0

C'est soit ça, soit @cart est nul parce que la méthode find_cart est nulle. Entre ces deux suggestions, vous devriez être capable de le comprendre. Le débogueur Ruby peut vous aider: http://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-ruby-debug – hgmnz

0

Je vais deviner que ce n'est pas une question de portée, comme le test RIR suivant montre:

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 

La meilleure façon de comprendre cela, IMO, est de savoir ce qui est dans le produit immédiatement après la recherche en utilisant un LOGGER.debug "product now contains #{product.inspect}".

Votre backtrace sera également informatif. À ce stade, il est difficile de dire ce que l'interprète se plaint. Il se peut que ce produit soit nul, mais tout aussi facilement, il peut s'agir de @cart ou de quelque chose référencé dans votre vue.

0

Comment @items est-il défini dans votre méthode add_product? Je ne le vois nulle part, n'est-ce pas?