2010-09-30 9 views
6

Consente di utilizzare un esempio reale.Come eseguire il Monkey Patch in Ruby on Rails?

Voglio patch di scimmia WillPaginate :: LinkRenderer.to_html metodo.

Finora ho provato:

  1. creato un file nella cartella: lib/scimmie/will_paginate_nohtml.rb
  2. Aggiunto in config/environments.rb: require 'scimmie/will_paginate_nohtml' alla fine del il file
  3. Dentro quel file, questo era il mio codice:

e

module Monkeys::WillPaginateNohtml 
    def to_html 
    debugger 
    super 
    end 
end 

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

Ma in qualche modo, il debugger non viene passato. Sembra che il patch non sia riuscito.

Qualsiasi aiuto sarebbe apprezzato, grazie!

risposta

10

E che dire di questo uno Solutions :-) di @shingana, @kandadaboggu non funziona in quanto non v'è alcuna "super" qui. Si desidera chiamare versione originale non la versione super.

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

+ 1 perché non c'è "super" quando si applica una patch, anche se io preferisco la risposta di @vise per personalizzare il renderer (e ci sarà un "super"). – hurikhan77

+0

Mi manca già alias_method_chain, ed è stato rimosso per circa un mese –

+0

@ MattBriggs Di cosa stai parlando? È ancora presente alla 4.0.2: http://apidock.com/rails/Module/alias_method_chain – Chloe

0

Penso che è necessario aprire il metodo

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

Prova questo:

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

Il titolo della tua domanda è fuorviante. Francamente, penso che probabilmente desideri semplicemente personalizzare la struttura della lista di pagine will_paginate, che può essere fatta in modo diverso.

Quindi nel tuo caso il modo giusto è estendere il renderer. Per esempio caricare il seguente da un inizializzatore (via config/initializers):

class CustomPaginationRenderer < WillPaginate::LinkRenderer 

    def to_html 
    # Your custom code, debugger etc 
    end 

end 

Quindi, per avere la vostra applicazione utilizzare questo renderer aggiungere il seguente al vostro file config/environment.rb:

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