将acts_as_taggable移动到包含的模块时出错

Bry*_*cke 3 ruby activerecord ruby-on-rails

如果我写这个,一切正常:

class A < ActiveRecord::Base
acts_as_taggable
end
Run Code Online (Sandbox Code Playgroud)

但是,如果我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
Run Code Online (Sandbox Code Playgroud)

上面代码中的错误是:

undefined local variable or method `acts_as_taggable' for C::ClassMethods:Module
Run Code Online (Sandbox Code Playgroud)

acts_as_taggable从附带的模块打电话不正确吗?

它是否需要在类定义中?

Phi*_*oss 5

当Ruby加载包含你的模块的文件B并到达该acts_as_taggable行时,它将尝试执行acts_as_taggable类方法ClassMethods(它不存在,因为它实际上是一个类方法ActiveRecord::Base).

可以使用该included方法在acts_as_taggable包含模块时调用.included传递包含模块的类,因此以下内容将起作用:

module B
  def self.included(base)
    base.acts_as_taggable

    # ...
  end

  # ...
end
Run Code Online (Sandbox Code Playgroud)