2009-03-26 5 views
0

Ceci est mon modèle d'action:résultats du modèle sous-classé dans NameError dans l'environnement de développement, mais pas dans le test

class Action < ActiveRecord::Base 
end 

class Fold < Action 
end 

class Check < Action 
end 

class Call < Action 
end 

class Bet < Action 
end 

Dans un autre modèle, j'ai ce

class Deal < ActiveRecord::Base 
    def Deal.parse_action(action_string) 
    case action_string 
    when "folds": Fold.new() 
    when "checks": Check.new() 
    when "calls": Call.new() 
    when "bets": Bet.new() 
    when "raises": Bet.new() 
    else nil 
    end 
    end 
    # ... 
end 

Maintenant, quand je teste ce si cela travaille dans mes tests unitaires, tout semble fonctionner. Mais dès que je lance le serveur Web en mode développement, je reçois ceci:

 
NameError (uninitialized constant Deal::Fold): 
    app/models/deal.rb:115:in `parse_action' 
    ... 

Pourquoi faut-il penser existe Fold au sein de l'espace de noms Deal? Et pourquoi cela ne se produit-il pas dans l'environnement de test?

Répondre

0

Je n'utilise pas Rails au travail, mais je rencontre parfois le scénario d'une classe connue lorsque j'exécute des tests, mais pas lorsque j'exécute l'exécutable. Cela se produit parce que j'ai les instructions "require" requises dans mes fichiers de test pour les fichiers pertinents, mais je n'avais pas réussi à mettre les instructions requises "require" dans le code de production.

+0

Cela a fonctionné pour moi. Je dois juste "require" action.rb "'dans le modèle Deal. – KaptajnKold

1

Il ne dit pas que Fold existe dans l'espace de noms Deal, il est dit qu'il cherche la Fold constante et il est actuellement à l'intérieur Deal. Par exemple, essayez ceci:

class Foo 
    def test; puts Bar; end 
end 
Foo.new.test 

et vous obtiendrez ceci:

NameError: uninitialized constant Foo::Bar 
    from (irb):3:in `test' 
    from (irb):7 
    from :0 

Rails a des choses à des constantes de chargement automatique pour vous et je devine que le problème est que vous n'avez pas avoir la classe Fold dans son propre fichier. Essayez de mettre la définition de classe Fold dans son propre fichier - app/models/fold.rb et voir si cela aide. Si c'est le cas, essayez de le remettre dans le fichier action.rb, puis de faire quelque chose qui provoquerait le chargement du fichier Action avant de faire l'instruction case, comme x = Action juste avant la déclaration de cas. Si cela fonctionne alors vous devez require "action.rb" dans deal.rb parce que le problème est que votre code de test charge action.rb (éventuellement par le biais d'un autre test) mais votre code de production ne l'est pas.

+0

Vous pourriez avoir besoin d'une action dans deal.rb. – scottd

-1

En Ruby ajouter une méthode à une classe que vous avez déclarer comme ceci:

class Deal < ActiveRecord::Base 
    def self.parse_action(action_string) 
     case action_string 
     when "folds": Fold.new 
     .... 

Ce peut être la source de vos problèmes.

Aussi (désolé de choisir nit) mais vous n'avez pas besoin de la parenthèse sur Fold.new. Vous êtes en mesure de transmettre des paramètres à des méthodes sans utiliser la parathèse.

+0

http://blog.jayfields.com/2007/10/ruby-defining-class-methods.html dit qu'il y a plus d'une façon de le faire. –

+0

BTW, voulez-vous dire "sans utiliser de parenthèses"? –

Questions connexes