2016-08-01 88 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