我的意思是,我想在我的模块中创建一个类方法,该方法将由包含该模块的类使用。它们位于不同的文件中。
到目前为止我有这样的事情:
module Base
def self.all
puts "All Users"
end
end
class User
include Base
end
但是我得到了:NoMethodError: undefined method
全部为用户:Class`
你能否解释一下这个问题,以及我所做的是一种不好的做法还是违反任何原则?
答案 0 :(得分:3)
你可以extend
你班级的模块,你的代码应该是这样的:
module Base
def all
puts "All Users"
end
end
class User
extend Base
end
当你做这样的事情时:
module MyModule
def self.module_method
puts "module!"
end
end
您实际上是在模块中添加方法,您可以像这样调用上一个方法:
MyModule.module_method
有一种方法可以包含module
并获得您想要的行为,但我不认为这可以被视为“走的路”。看一下这个例子:
module Base
def self.included(klass)
def klass.all
puts "all users"
end
end
end
class User
include Base
end
但就像我说的那样,如果你可以使用extend
类方法,那就更好了。
答案 1 :(得分:0)
根据里卡多的回答,考虑一下Ruby程序员常用的习惯用法 - 将模块的类方法包含在内部模块中,称为ClassMethods(我知道这是一口),并使用Module #include钩子来扩展基类和ClassMethods模块。
此处提供更多信息:http://www.railstips.org/blog/archives/2009/05/15/include-vs-extend-in-ruby/