如何在一个类中包含一个模块

时间:2017-10-12 15:45:55

标签: ruby-on-rails ruby rubygems include autoload

我的gem中的模块包含在另一个gem的类中,该类由Rails应用程序中的自定义类扩展:

我的宝石:

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

另一个宝石:

class AnotherGem
end

Rails app中的类:

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

如何在课程延长之前确保我的模块被包含在内?

修改

我尝试在MyGem中直接包含ClassInRailsApp,但指定的实例方法仍然不可用。问题可能与此有关吗?

1 个答案:

答案 0 :(得分:2)

在你的想法中,你只是在调用一种方法,例如: @ object.my_method。实际上,您正在调用类级方法,例如Object.my_method,但将其定义为实例级方法。执行你正在尝试的方法的正确方法是Object.new.my_method,但是,不要这样做。

要调用这样的方法,您必须将其定义为类的方法。有关更好的理解,请参阅this page。特别是关于如何通过模块定义类级方法的“A Common Idiom”部分。