2010-04-07 4 views
3

J'ai un modèle Book dans mon application Rails, avec diverses propriétés (alias colonnes dans la table book db). L'une de ces propriétés est "classement".À l'origine de "NoMethodError: méthode non définie` include? " pour nil: NilClass "

Récemment, peut app a commencé à jeter NoMethodError: undefined method 'include?' for nil:NilClass pour le code suivant:

def some_method(book, another_arg) 
    return book.ranking unless book.ranking.blank? 
    ... 
end 

Cependant, ce n'est pas cohérente. La grande majorité du temps, en accédant à book.ranking fonctionne - l'erreur est levée peut-être 2-4% du temps. Si je change le code à book[:ranking] ou book['ranking'] au lieu de book.ranking, cela fonctionne 100% du temps.

Des idées?

P.S. Ce problème a surgi par intermittence avec d'autres modèles et attributs ... pas seulement Book et l'attribut de classement.

+0

Ce qui se passait pour moi parfois dans la console après recharger l'application. J'ai compris d'où cela venait une fois, mais j'ai oublié. Quelque part dans le code des rails. Je pense que c'est peut-être lié à l'interface mysql, utilisez-vous mysql? – mckeed

+0

J'utilise PostgreSQL, et mon application fonctionne sur Heroku. Lorsque je me connecte à distance à la console de Heroku, cette erreur apparaît tout le temps (mais jamais sur ma console locale). – NudeCanalTroll

+0

Je sais que c'est vraiment vieux maintenant, mais j'ai upvoted, car je vois la même erreur concernant une méthode qui vérifie '.nil?' Plutôt que '.blank?'.Cela ne se produit pas de manière cohérente et une seconde exécution du même code, ou une actualisation de page, semble toujours revenir au comportement attendu. Cela n'a commencé à se produire que lorsque j'ai changé l'environnement de développement de SQLite3 en MySQL afin d'imiter plus étroitement l'environnement de production, donc je suis enclin à être d'accord avec @mckeed. – Leo

Répondre

2

l'objet livre est celui qui est nul, pas de classement. Donc avoir

return book.ranking unless book.nil? 

devrait résoudre le problème.

+0

Si c'est le cas, l'erreur ne devrait-elle pas être 'NoMethodError: méthode non définie' ranking 'pour nil: NilClass'? – NudeCanalTroll

+0

Bon point, je pense que j'ai tort. Je regarde http://github.com/rails/rails/blob/2-3-stable/activerecord/lib/active_record/attribute_methods.rb, le method_missing (qui est appelé quand vous appelez votre méthode de classement) semble appeler comprendre? sur @attributes. Peut-être que c'est nul pour une raison quelconque? –

+1

J'ai rencontré ce problème: il n'y avait rien à faire avec l'objet étant nul comme beaucoup l'ont dit sur ce sujet, mais c'était quelque chose qui ne va pas dans les rails. "question.id" provoquait une erreur? erreur mais "question [: id]" a bien fonctionné. Je pense que c'est quelque chose avec @attributes comme Rob suggère, mais je ne peux pas le définir. La sortie de "question.attributes" à l'enregistreur a semblé renvoyer des résultats totalement normaux. –

0

vous devriez vérifier si livre est nul soit

return book.ranking unless book.blank? and book.ranking.blank? 
1

J'utilise try ici:

book.try(:ranking) 

Si book ou ranking est nil alors nil sera retourné.

+0

try fonctionne, mais ce n'est pas dans Ruby 1.8 ... Vous devez utiliser Active Support pour l'obtenir en 1.8 – severin

+0

@severin: Étant donné qu'il s'agit d'une question Rails, je suppose qu'ils ont déjà utilisé le support actif. –

0

Vous pouvez le faire aussi de cette façon:

return book.ranking unless book and book.ranking 

ou andand bijou:

return book.ranking unless book.andand.ranking 
1

il y a quelques façons de protéger de zéro AppEntrants:

vérifier avec si:

return book.ranking if book 

utilisation & &/et:

return book && book.ranking 

utilisation essayer (en Ruby 1.9 ou avec Rails/ActiveSupport):

return book.try(:ranking) 
Questions connexes