Ruby如何从前置模块调用方法

时间:2014-05-23 18:25:26

标签: ruby-on-rails ruby

我有一个模特:

class MyModel
  prepend MyModelOverride

  def find_something
    #returns something
  end
end

module MyModelOverride
  included do
    def method1
      find_something
    end
  end
end

MyModel.new.method1

最后一次调用会返回以下错误:

NoMethodError: undefined method `method1' for #<MyModel:0x007f089c673b48>

如何正确格式化MyModelOverride中的代码,以便我可以从MyModel的实例中调用其中的方法我可以从其中调用MyModel的其他方法?

2 个答案:

答案 0 :(得分:2)

要通过mixin /模块包含方法,您只需要:

module MyModelOverride
  def method1
    find_something
  end
end

这将使method1成为您包含它的任何类的实例方法。

您在示例中使用的included块来自ActiveSupport::Concern。如果您想将ActiveSupport :: Concern用于更高级的包含概念,请将其包含在您的模块中:

module MyModelOverride
  extend ActiveSupport::Concern

  included do
    # macros to run when module is included, like `scope` or `has_many` etc.
  end

  def method1
    find_something
  end
end

答案 1 :(得分:1)

我会使用prepended挂钩: -

module MyModelOverride
  def self.prepended(klass)
    klass.class_eval do
      def method1
        find_something
      end
    end
  end
end


class MyModel
  prepend MyModelOverride

  def find_something
    12
  end
end

MyModel.new.method1 # => 12