J'ai un mixin pour lequel j'aimerais avoir une liste de toutes les classes qui l'ont inclus. Dans le module mixin, je l'ai fait ce qui suit:Obtenir une liste des classes qui incluent un module
module MyModule
def self.included(base)
@classes ||= []
@classes << base.name
end
def self.classes
@classes
end
end
class MyClass
include MyModule
end
Cela fonctionne assez bien:
> MyModule.classes #=> nil
> MyClass.new #=> #<MyClass ...>
> MyModule.classes #=> ["MyClass"]
Maintenant, je voudrais extraire cette partie dehors dans un module séparé qui peut être inclus dans mon autre les mixins. Alors, je suis venu avec ce qui suit:
module ListIncludedClasses
def self.included(base)
p "...adding #{base.name} to #{self.name}.classes"
@classes ||= []
@classes << base.name
base.extend(ClassMethods)
end
def self.classes
@classes
end
module ClassMethods
def included(module_base)
p "...adding #{module_base.name} to #{self.name}.classes"
@module_classes ||= []
@module_classes << module_base.name
super(module_base)
end
def classes
@module_classes
end
end
end
module MyModule
include ListIncludedClasses
end
Cela ne fonctionne pas bien, parce que la méthode #include (de module_base) ajouté à MyModule de ListIncludedClasses est jamais se faire écraser. Fait intéressant, il ajoute avec succès #classes à MyModule.
> MyModule.classes #=>
"...adding Rateable to ListIncludedClasses.classes"
=> nil
> ListIncludedClasses #=> ["MyModule"]
> MyClass.new #=> #<MyClass ...>
# ^^ THIS SHOULD BE ADDING MyClass TO MyModule.classes ^^
> MyModule.classes #=> nil
Que manque-t-il?
N'oubliez pas d'indiquer que j'ai répondu à votre question! – Tom
avez-vous essayé ceci: http://stackoverflow.com/questions/3527445/when-are-modules-included-in-a-ruby-class-running-in-rails – rickypai