我的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
,但指定的实例方法仍然不可用。问题可能与此有关吗?
答案 0 :(得分:2)
在你的想法中,你只是在调用一种方法,例如: @ object.my_method。实际上,您正在调用类级方法,例如Object.my_method,但将其定义为实例级方法。执行你正在尝试的方法的正确方法是Object.new.my_method,但是,不要这样做。
要调用这样的方法,您必须将其定义为类的方法。有关更好的理解,请参阅this page。特别是关于如何通过模块定义类级方法的“A Common Idiom”部分。