2010-09-30 69 views
6

讓我們使用一個真實世界的例子。如何在Ruby on Rails中修補猴子?

我想猴子補丁WillPaginate :: LinkRenderer.to_html方法。

到目前爲止,我曾嘗試:

  1. 創建文件夾中的文件:在配置/ environments.rb的lib /猴/ will_paginate_nohtml.rb
  2. 補充:需要 '猴子/ will_paginate_nohtml' 在結束文件
  3. 在這個文件中,這是我的代碼:

Ë

module Monkeys::WillPaginateNohtml 
    def to_html 
    debugger 
    super 
    end 
end 

WillPaginate::LinkRenderer.send(:include, Monkeys::WillPaginateNohtml) 

但不知何故,調試器不會通過。看起來修補失敗。

任何幫助將不勝感激,謝謝!

回答

10
有關@shingana這一個:-)解決方案

什麼,@kandadaboggu將無法工作,因爲沒有「超級」在這裏。你想撥打原版版本不是超級版本。

module WillPaginate 
    class LinkRenderer 
    alias_method :to_html_original, :to_html 
    def to_html 
     debugger 
     to_html_original 
    end 
    end 
end 
+0

+ 1因爲補丁時沒有「超級」,儘管我更喜歡@vise的回答來定製渲染器(並且會有一個「超級」)。 – hurikhan77 2010-09-30 19:06:51

+0

我已經有點想念alias_method_chain了,它的唯一一個月已經過去了 – 2010-09-30 19:13:49

+0

@MattBriggs你在說什麼?它仍然存在於4.0.2中:http://apidock.com/rails/Module/alias_method_chain – Chloe 2014-03-28 16:04:16

0

我認爲你需要打開方法

module WillPaginate 
    class LinkRenderer 
    def to_html 
     debugger 
     super 
    end 
    end 
end 
0

試試這個:

class WillPaginate::LinkRenderer 
    def to_html 
    debugger 
    super 
    end 
end 
5

您的問題的標題是誤導。坦率地說,我想你可能只是想自定義will_paginate頁面列表結構,這可以以不同的方式完成。

所以在你的情況下,正確的方法是擴展渲染器。例如從裝載的初始化以下(通過配置/初始化):

class CustomPaginationRenderer < WillPaginate::LinkRenderer 

    def to_html 
    # Your custom code, debugger etc 
    end 

end 

然後,向具有應用程序中使用此渲染器將以下添加到你的配置/ environment.rb文件中:

WillPaginate::ViewHelpers.pagination_options[:renderer] = 'CustomPaginationRenderer'