2017-04-15 1 views
1

Si tout est un objet/classe dans ruby, pourquoi ne peut pas me dire le nom d'une classe/objet qui provoque une erreur.erreur de méthode undefined avec nom de classe bizarre

undefined method `changed_servings?' for #<#<Class:0x00000009a4fa70>:0x00000009814558>): 

Je veux savoir ce que signifie essentiellement <Class:0x00000009a4fa70>:0x00000009814558> ...

+1

Montrez-nous le code qui est à l'origine de cette erreur. –

+2

Ceci est généralement généré à partir d'une classe créée dynamiquement en utilisant 'Class.new', et sans lier la classe à une constante (nommer la classe). –

Répondre

2

Normalement, Ruby donnera le nom de la classe que la méthode manquante est de. Par exemple, si je suis en IRB et que je crée, instancie et puis appelle une méthode manquante, Ruby me donnera plus de détails que Rails.

class Widget 
    def initialize 
    @widget = 42 
    end 
end 

J'instancier la classe:

test = Widget.new 

Je reviens l'ID du nouveau fait l'objet et le nom de classe:

#<Widget:0x007f850982f560 @widget=42> 

Et si je l'appelle une méthode qui est ne fait pas partie du Widget:

test.no_method 

je reçois un message agréable de RIR:

NoMethodError: undefined method `no_method' for #<Widget:0x007f850982f560 @widget=42> 

Mais revenons à Rails ... Je ne suis pas sûr précisément pourquoi, peut-être à cause de la façon dont le Rails MVC est architecturé, les noms réels des classes ont été laissées out, et seuls les ID d'objet sont donnés dans le message d'erreur.

Si j'ai fait une application de film, et je suis dans l'application/vues/modèle/show.html.erb et j'appelle une méthode qui n'existe pas comme:

<% no_method %> 

Mon application sera éclatez, avec le message suivant:

undefined local variable or method `no_method' for #<#<Class:0x007fb9a51553b8>:0x007fb9a4951c48> 

Je parierais un pari que le premier ID est lié à ID modèle de l'objet et le second est Voir l'ID de l'objet, mais je suis tout à fait planer le doute sur cela. Mais c'est l'information ci-dessus ce message qui vous donnera le chemin du fichier que l'erreur vient, dans mon cas, juste au-dessus du message d'erreur de méthode non définie est:

NoMethodError in Movies#index 

En tout cas, vous pouvez également faire une recherche dans vos modèles de vue pour cette méthode de rupture et vous devriez le trouver. J'espère que cela pourra aider. Supposons que nous écrivions ce qui suit:

0

class C 
end 

C.class_method 
    #=> NoMethodError: undefined method `class_method' for C:Class 
c = C.new 
    #=> #<C:0x007fe12bd1eb10> 
c.instance_method 
    # NoMethodError: undefined method `instance_method' for #<C:0x007fe12bd1eb10> 

Aucune surprise ici. Faisons maintenant la même chose mais créons une classe anonyme dynamiquement.

klass = Class.new 
    #=> #<Class:0x007fe12bce5720> 
klass.class_method 
    #=> NoMethodError: undefined method `class_method' for #<Class:0x007fe12bce5720> 
k = klass.new 
    #=> #<#<Class:0x007fe12bce5720>:0x007fe12bcc4fc0> 
k.instance_method 
    #=> NoMethodError: undefined method `instance_method' for 
    # #<#<Class:0x007fe12bce5720>:0x007fe12bcc4fc0> 

Et voilà!

Soit dit en passant, vous pouvez créer une classe dynamique et attribuez-lui un nom ainsi:

Object.const_set 'C', Class.new 
    #=> C 

Alors maintenant, vous pouvez écrire

C.class_method 
    #=> NoMethodError: undefined method `class_method' for C:Class 
C.new.instance_method 
    #=> NoMethodError: undefined method `instance_method' for #<C:0x007fe12bc766e0>