2009-11-10 3 views
3

Si j'écris ceci, tout fonctionne très bien:Erreur de se déplacer acts_as_taggable dans un module inclus

class A < ActiveRecord::Base 
acts_as_taggable 
end 

Mais si je prends acts_as_taggable et le mettre dans un module de classe A comprend, je reçois une erreur:

module B 
    def self.included(base) 
    base.class_eval do 
     extend ClassMethods 
     include InstanceMethods 
    end 
    end 

    module ClassMethods 
    acts_as_taggable 
    end 

    module InstanceMethods 
    end 
end 

class A < ActiveRecord::Base 
include B 

l'erreur dans le code ci-dessus est la suivante:

undefined local variable or method `acts_as_taggable' for C::ClassMethods:Module 

N'est-il pas correct d'appeler acts_as_taggable à partir d'un module inclus?

Est-ce que cela doit être dans la définition de classe elle-même?

Répondre

5

Lorsque Ruby charge le fichier contenant votre module B et atteint la ligne acts_as_taggable, il essaiera d'exécuter la méthode de classe acts_as_taggable de ClassMethods (qui n'existe pas parce qu'il est en fait une méthode de classe de ActiveRecord::Base).

Vous pouvez utiliser la méthode included pour appeler acts_as_taggable lorsque votre module est inclus cependant. included est passé à la classe le module est inclus, de sorte que ce qui suit fonctionnera:

module B 
    def self.included(base) 
    base.acts_as_taggable 

    # ... 
    end 

    # ... 
end 
Questions connexes