2010-09-30 26 views
6

Permite usar un ejemplo del mundo real.¿Cómo Monkey Patch en Ruby on Rails?

Quiero parche de mono WillPaginate :: LinkRenderer.to_html método.

Hasta aquí he intentado:

  1. creado un archivo en la carpeta: lib/monos/will_paginate_nohtml.rb
  2. Agregado en config/environments.rb: require 'monos/will_paginate_nohtml' al final de el archivo
  3. Dentro de ese archivo, este fue mi código:

e

module Monkeys::WillPaginateNohtml 
    def to_html 
    debugger 
    super 
    end 
end 

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

Pero de alguna manera, el depurador no pasa. Parece que el parche falló.

¡Cualquier ayuda sería apreciada, gracias!

Respuesta

10

Y qué acerca de esto Soluciones :-) por @shingana, @kandadaboggu no funcionará ya que no hay "super" aquí. Desea llamar a original versión no super versión.

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

+ 1 porque no hay "super" cuando parche, aunque preferiría la respuesta de @vise para personalizar el renderizador (y habrá un "super"). – hurikhan77

+0

Ya echo de menos alias_method_chain, y solo ha desaparecido durante aproximadamente un mes –

+0

@MattBriggs ¿De qué estás hablando? Todavía está allí desde 4.0.2: http://apidock.com/rails/Module/alias_method_chain – Chloe

0

creo que es necesario abrir el método

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

Prueba esto:

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

El título de tu pregunta es engañoso. Francamente, creo que probablemente solo quieras personalizar la estructura de la lista de páginas will_paginate, que se puede hacer de manera diferente.

Por lo tanto, en su caso, la forma correcta es extender el renderizador. Por ejemplo cargar lo siguiente de un inicializador (por medio de config/inicializadores):

class CustomPaginationRenderer < WillPaginate::LinkRenderer 

    def to_html 
    # Your custom code, debugger etc 
    end 

end 

Entonces, para tener su aplicación utilizar este procesador de añadir lo siguiente a su archivo config/environment.rb:

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