覆盖第三方模块中的方法

时间:2016-08-01 10:48:12

标签: ruby module override

我试图覆盖第三方库中两个模块内的方法。

看起来像这样:

module Omnigollum
  module Helpers
    def kick_back
      redirect !request.referrer.nil? && request.referrer !~ /#{Regexp.escape(settings.send(:omnigollum)[:route_prefix])}\/.*/ ?
        request.referrer:
        '/'
      halt
    end
  end
end

此库中的其他函数使用此方法。我需要完全覆盖它。

我尝试了其他stackoverflow线程给出的大量解决方案,但到目前为止没有任何作用。

以下是我现在所拥有的:

module OmnigollumOverride
  module Helpers
    def kick_back
      puts '=-=-=-=-=-=-=-=-=-==-=-'
      puts '=-=-=-=-=-=-=-=-=-==-=-'
    end
  end
end

include Omnigollum
Omnigollum.module_eval { include OmnigollumOverride }

我只是打印一行来测试方法是否被正确覆盖。

1 个答案:

答案 0 :(得分:0)

而不是:

include Omnigollum
Omnigollum.module_eval { include OmnigollumOverride }

打电话一次:

Omnigollum::Helpers.prepend OmnigollumOverride::Helpers

前置模块将其置于继承层次结构之上。无论您是想重新使用原始行为,都可以:

def kick_back
  return super if SOME_CONDITION # call original method

  puts '=-=-=-=-=-=-=-=-=-==-=-'
  puts '=-=-=-=-=-=-=-=-=-==-=-'
end