2017-01-10 8 views
6

Я хотел бы переопределить метод gem (расширение Jekyll), который выглядит так:Как обезьяна-патч расширения Jekyll или плагина?

Файл: lib/jekyll-amazon/amazon_tag.rb.

module Jekyll 
    module Amazon 
    class AmazonTag < Liquid::Tag 
     def detail(item) 
... 
     end 
    end 
    end 
end 
Liquid::Template.register_tag('amazon', Jekyll::Amazon::AmazonTag) 

Я поставил код с той же структурой в моем проекте в папке config/initializers/presentation.rb _plugins/presentation.rb. Если я изменил имя метода detail на новое имя, оно работает, но я не могу заставить его переопределить имя detail. Что я сделал не так?

(Примечание. В версии 0.2.2 от Джекил-амазонки камень, метод detail является частным, и я не изменил это локально, так что этот метод уже не частный)

+0

Похоже, нам повезло: jekyll-amazon теперь поддерживает [пользовательские шаблоны] (https://github.com/tokzk/jekyll-amazon/issues/6). – approxiblue

+0

Да, но я все еще хочу знать (для моих собственных знаний), как переопределить оригинальный камень. –

ответ

1

Вы можете использовать alias_method

module Jekyll 
    module Amazon 
    class AmazonTag < Liquid::Tag 

     alias_method :old_detail, :detail 

     def detail(item) 
     # do your stuff here 
     # eventually pass your stuff to old method 
     old_detail(item) 
     end 

    end 
    end 
end 
Liquid::Template.register_tag('amazon', Jekyll::Amazon::AmazonTag) 
+0

положите его в корень вашего сайта jekyll в папку '_plugins' –

+0

Я получаю' jekyll 3.3.1 | Ошибка: неопределенный метод 'detail' для класса Jekyll :: Amazon :: AmazonTag' –

+0

Вы настроили этот https://jekyllrb.com/docs/plugins/#installing-a-plugin? –