如果我写这个,一切正常:
class A < ActiveRecord::Base
acts_as_taggable
end
但是,如果我将acts_as_taggable
放入A类包含的模块中,我会收到错误:
module B
def self.included(base)
base.class_eval do
extend ClassMethods
include InstanceMethods
end
end
module ClassMethods
acts_as_taggable
end
module InstanceMethods
end
end
class A < ActiveRecord::Base
include B
上述代码中的错误是:
undefined local variable or method `acts_as_taggable' for C::ClassMethods:Module
从附带的模块中调用acts_as_taggable
是不正确的?
是否需要在类定义中?
答案 0 :(得分:5)
当Ruby加载包含模块B
的文件并到达acts_as_taggable
行时,它将尝试执行acts_as_taggable
的{{1}}类方法(不因为它实际上是ClassMethods
)的类方法而存在。
您可以使用ActiveRecord::Base
方法在您的模块被包含时调用included
。 acts_as_taggable
传递给包含模块的类,因此以下内容将起作用:
included