2017-10-12 135 views
0

在我的创业板模块包含在其他宝石类,它是由一个自定义类的Rails应用程序扩展一个类模块:如何包括在

我的宝石:

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

另一宝石:

class AnotherGem 
end 

类中的Rails应用:

class ClassInRailsApp < AnotherGem 
end 

运行这将导致以下行为:

$ 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 

我怎样才能确保该类扩展,才能将我的模块?

编辑:

我试图直接包括ClassInRailsAppMyGem和指定实例方法仍然是不可用的。这个问题是否与此有关?

+0

你这里的例子代码实际上产生'true',所以我不确定你的问题到底是什么。这应该有效,并且对我有用。 – tadman

回答

1

在你的想法中,你只是调用一个方法,例如@ object.my_method。实际上,您正在调用Class level方法,例如Object.my_method,但将其定义为实例级别的方法。正确的方法来做你想要的是Object.new.my_method,但是,不要那样做。

要调用这样的方法,您必须将其定义为类上的方法。请参阅this page,以获得更好的理解。特别是关于如何通过模块定义类级别方法的“常见成语”部分。