2016-08-01 50 views
0

我试图重写第三方库中两个模块内部的方法。第三方模块中的替代方法

它看起来像这样:

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 } 

我只是打印了一些线测试方法是否正确地覆盖。

回答

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