2009-03-03 18 views
9

Nous continuons à voir des avertissements comme les points suivants lorsque nous courons nos spécifications:Ruby Objet # avertissements id et Active Record

Object id # sera désapprouvée, use Object # object_id

Le code en question accède à l'ID d'un modèle ActiveRecord (qui est un attribut sur la table, évidemment, plutôt que l'ID d'instance d'objet dans la machine virtuelle Ruby).

Est-ce que quelqu'un sait comment désactiver ces avertissements ou les éviter?

+0

Si tel est un test, êtes-vous sûr vous accédez à un véritable actif entité d'enregistrement, et pas un objet ruby ​​régulière? –

+0

Ah ... il se peut que ce soit des objets mockés –

+0

Vous devriez répondre à la question, car cela l'a totalement corrigé. –

Répondre

6

Je suppose que vous faites se moquant/stubbing (parce que vous avez mentionné les spécifications).

Dans mon cas, je rencontre ces avertissements lorsque je stub un objet ActiveRecord et que j'accède à son attribut ID.

Dans le cas où vous prévoyez d'accéder à l'ID de votre objet ActiveRecord, je vous recommande de faire ce qui suit:

mock("MyActiveRecordObject", :id => 1001) 
10

Lorsqu'un objet est descendu de ActiveRecord::Base, un appel à id va à AR :: méthode B id plutôt que sur un dépréciée Object. Cet avertissement signifie généralement qu'un de mes objets n'est pas ce que je pense qu'il est.

+0

J'aimerais pouvoir accepter deux bonnes réponses ... –

2

L'avertissement object # id ne se produit que sur les classes ruby ​​classiques telles que NilClass. ActiveRecord :: Base remplace l'objet # id

4

Votre objet n'est pas réellement un objet AR, indiquant généralement que certaines données ont été récupérées (Table.find_by_name('nonexistent name') renverra nil). Si tout ce que vous voulez faire est de désactiver les avertissements visibles, vous pouvez désactiver whiny_nils dans votre configuration, sinon effectuez un test is_a? avant d'essayer d'accéder aux attributs de l'objet et de gérer le cas de défaillance avec élégance.

15

Essayez d'utiliser [:id] au lieu de .id

+0

pourquoi cette réponse a-t-elle été annulée? c'est correct. – ttvd

+0

Parce qu'il y avait un utilisateur qui était malveillant et downvoting mon tout. –

+0

je suis upvoting ceci .. – bragboy