通过良好的语法,可以轻松地为类添加功能。
无论如何,在Rails 3.2中,不推荐使用InstanceMethods模块。如果我理解正确,我们应该在中定义我们的方法(实际上它只是在模块的主体中):included
块
# edit: don't do this! The method definition should just be in the body of the module
included do
def my_method; end
end
我只是想知道是否有人知道他们为什么决定这样做?
答案 0 :(得分:27)
让我们看一下您首先链接的示例。
module TagLib
extend ActiveSupport::Concern
module ClassMethods
def find_by_tags()
# ...
end
end
module InstanceMethods
def tags()
# ...
end
end
end
当您将TagLib包含到您的类中时AS Concern会自动使用ClassMethods模块扩展该类,并包含InstanceMethods模块。
class Foo
include TagLib
# is roughly the same as
include TagLib::InstanceMethods
extend TagLib::ClassMethods
end
但是您可能已经注意到我们已经包含了TagLib模块本身,因此其中定义的方法已经可以作为类的实例方法使用。为什么你想要一个单独的InstanceMethods模块?
module TagLib
extend ActiveSupport::Concern
module ClassMethods
def find_by_tags()
# ...
end
end
def tags()
# ...
end
end
class Foo
include TagLib
# does only `extend TagLib::ClassMethods` for you
end