2010-08-25 3 views
0

Setup: Rails 3 RC2, Ruby 1.9.2 p0 (également essayé on Rails 3 bêta 4, Ruby 1.8.7 p174).Recueillir sur une belongs_to augmentation NoMethodError: méthode non définie ajouter » pour zéro: NilClass

J'ai pas la configuration du panier de base:

Order has_many :order_items 
Order has_many :products, :through => :order_items, :dependent => :restrict 

Product has_many :order_items 
Product has_many :orders, :through => :order_items, :dependent => :restrict 

OrderItem belongs_to :product 
OrderItem belongs_to :order 

Après la création de produits et OrderItems je la tête dans la console et effectuez les opérations suivantes:

Order.last.order_items.collect { |item| { :name => item.product.name, :quantity => item.quantity } } 

et je reçois une erreur:

NoMethodError: undefined method `add' for nil:NilClass 
    from /Users/tcoop/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.0.rc2/lib/active_support/whiny_nil.rb:48:in `method_missing' 
    from /Users/tcoop/.rvm/gems/ruby-1.9.2-p0/gems/bullet-2.0.0.rc1/lib/bullet/detector/n_plus_one_query.rb:21:in `create_notification' 
    from /Users/tcoop/.rvm/gems/ruby-1.9.2-p0/gems/bullet-2.0.0.rc1/lib/bullet/detector/n_plus_one_query.rb:14:in `call_association' 
    from /Users/tcoop/.rvm/gems/ruby-1.9.2-p0/gems/bullet-2.0.0.rc1/lib/bullet/active_record3.rb:78:in `load_target' 
    from /Users/tcoop/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.0.rc2/lib/active_record/associations/association_proxy.rb:118:in `reload' 
    from /Users/tcoop/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.0.rc2/lib/active_record/associations.rb:1451:in `block in association_accessor_methods' 
    from (irb):6:in `block in irb_binding' 
    from /Users/tcoop/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.0.rc2/lib/active_record/associations/association_collection.rb:430:in `block in method_missing' 
    from /Users/tcoop/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.0.rc2/lib/active_record/associations/association_proxy.rb:216:in `block in method_missing' 
    from /Users/tcoop/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.0.rc2/lib/active_record/associations/association_proxy.rb:216:in `collect' 
    from /Users/tcoop/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.0.rc2/lib/active_record/associations/association_proxy.rb:216:in `method_missing' 
    from /Users/tcoop/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.0.rc2/lib/active_record/associations/association_collection.rb:430:in `method_missing' 
    from (irb):6 
    from /Users/tcoop/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.0.0.rc2/lib/rails/commands/console.rb:44:in `start' 
    from /Users/tcoop/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.0.0.rc2/lib/rails/commands/console.rb:8:in `start' 
    from /Users/tcoop/.rvm/gems/ruby-1.9.2-p0/gems/railties-3.0.0.rc2/lib/rails/commands.rb:23:in `<top (required)>' 
    from script/rails:6:in `require' 
    from script/rails:6:in `<main>' 

je sais que les produits existent et que le order_item est valide ... Si je fais ce qui suit:

ruby-1.9.2-p0 > Order.last.order_items.collect { |item| { :name => item.product_id, :quantity => item.quantity } } 

Puis-je obtenir ce que j'attendais: => [{:name=>3, :quantity=>1}, {:name=>1, :quantity=>4}]

Je ne suis pas Bien sûr, pourquoi appeler un attribut sur l'objet associé (item.product.name) provoque-t-il des erreurs? Quelqu'un peut-il nous éclairer là-dessus?

EDIT Je viens d'ajouter ce qui suit comme un commentaire, mais la mise en forme est horrible ...

J'ai aussi oublié de mentionner que cela se produit uniquement avec il y a plus de 1 ordre_items. 1 article de commande fonctionne comme prévu. ET ce qui suit semble résoudre mon problème ...

products = order.order_items.collect do |item| 
    uid = item.product.uid 
    { :ProductUID => uid, :Quantity => item.quantity } 
end 

Merci

+0

J'ai aussi oublié de mentionner que cela se produit uniquement avec il y a plus de 1 ordre_items. 1 article de commande fonctionne comme prévu. ET ce qui suit semble résoudre mon problème ... products = order.order_items.collect do | item | # affecter l'attribut de produit à une variable uid = item.product.uid {: ProductUID => uid,: Quantity => item.quantity} end –

+0

Apparemment ma dernière modification (définition de l'UID en tant que variable locale) uniquement travaillé pour 2 articles de commande ... Plus et je reçois les mêmes erreurs qu'avant! –

Répondre

0

Ceci est faux au moins (ou vous avez fait une faute de frappe)

Product has_many :order, :through => :order_items, :dependent => :restrict 
         | 
         V 
Product has_many :orders, :through => :order_items, :dependent => :restrict 

Difficile à dire si elle se plaint à ce sujet avec toutes ces méthodes manquantes qui volent autour mais correctes au moins. À votre santé.

+0

la partie amusante est que cela m'a fait réaliser que j'ai utilisé le pluriel dans un belongs_to sur l'application sur laquelle je travaille en ce moment. : D – Hugo

+0

C'est une faute de frappe. Je le réparerai. –

0

Il semble que la gemme de balle (actuellement en RC) était à l'origine du problème. J'ai trouvé ce numéro (http://github.com/flyerhzm/bullet/issues/#issue/31) sur la page bullet github. J'ai laissé mes informations là pour que le propriétaire les examine.

0

Désolé pour le retard, je suppose que la question devrait être résolu si vous mettez à niveau votre petit bijou de balle à 2.0.0.rc2

Questions connexes