【问题标题】:Override method in a third party module第三方模块中的覆盖方法
【发布时间】:2016-12-06 10:02:32
【问题描述】:

我正在尝试覆盖来自第三方库的两个模块中的方法。

看起来像这样:

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 }

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

【问题讨论】:

    标签: ruby module overriding


    【解决方案1】:

    代替:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-10
      • 2011-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-04
      • 2017-05-10
      • 1970-01-01
      相关资源
      最近更新 更多