2017-10-12 21 views
0

Un module dans mon petit bijou est inclus dans une classe dans une autre pierre précieuse, qui se prolonge par une classe personnalisée dans une application Rails:Comment inclure un module dans une classe

Mon petit bijou:

module MyGem 
    def my_method 
    end 
end 
AnotherGem.send :include, MyGem 

Un autre joyau:

class AnotherGem 
end 

classe dans l'application Rails:

class ClassInRailsApp < AnotherGem 
end 

L'exécution de ce conduit au comportement suivant:

$ rails c 
Loading development environment (Rails 5.1.4) 
irb(main):004:0> MyGem.method_defined? :my_method 
=> true 
irb(main):005:0> AnotherGem.method_defined? :my_method 
=> true 
irb(main):006:0> ClassInRailsApp.method_defined? :my_method 
NoMethodError: undefined method `my_method' for ClassInRailsApp:Class 

Comment puis-je assurer que mon module est inclus avant la classe est étendue?

EDIT:

J'ai essayé d'inclure directement dans MyGemClassInRailsApp et la méthode d'instance spécifiée est toujours pas disponible. Est-ce que la question pourrait être liée à cela?

+0

Votre exemple de code produit actuellement 'true', donc je ne suis pas sûr de savoir quel est votre problème, précisément. Cela devrait fonctionner, et cela fonctionne pour moi. – tadman

Répondre

1

Dans votre pensée, vous appelez simplement une méthode, par ex. @ object.my_method. En réalité, vous appelez la méthode de niveau Classe, par ex. Object.my_method, mais défini comme méthode de niveau d'instance. La façon correcte de faire ce que vous essayez serait Object.new.my_method, cependant, ne faites pas cela.

Pour appeler une méthode comme celle-ci, vous devez la définir comme une méthode sur la classe. Voir this page, pour une meilleure compréhension. Plus précisément la section "A Common Idiom" sur la façon de définir les méthodes de niveau classe via un module.