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

时间:2009-11-10 23:14:31

标签: ruby-on-rails ruby activerecord

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

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是不正确的?

是否需要在类定义中?

1 个答案:

答案 0 :(得分:5)

当Ruby加载包含模块B的文件并到达acts_as_taggable行时,它将尝试执行acts_as_taggable的{​​{1}}类方法(不因为它实际上是ClassMethods)的类方法而存在。

可以使用ActiveRecord::Base方法在您的模块被包含时调用includedacts_as_taggable传递给包含模块的类,因此以下内容将起作用:

included