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