2010-09-30 4 views
6

Utilisons un exemple du monde réel.Comment faire un patch de singe dans Ruby on Rails?

Je veux patch de singe méthode WillPaginate :: LinkRenderer.to_html.

Jusqu'à présent, j'ai essayé:

  1. créé un fichier dans le dossier: lib/singes/will_paginate_nohtml.rb
  2. Ajouté dans config/environments.rb: require 'singes/will_paginate_nohtml' à la fin de le fichier
  3. Dans ce fichier, ce fut mon code:

e

module Monkeys::WillPaginateNohtml 
    def to_html 
    debugger 
    super 
    end 
end 

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

Mais d'une manière ou d'une autre, le débogueur n'est pas transmis. On dirait que le correctif a échoué.

Toute aide serait appréciée, merci!

Répondre

10

Et par @shingana, @kandadaboggu ne fonctionnera pas celui-ci :-) Solutions comme il n'y a "super" ici. Vous voulez appeler version originale pas la version super.

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

+ 1 parce qu'il n'y a pas de "super" quand vous patchez, bien que je préfère la réponse de @vise pour personnaliser le rendu (et il y aura un "super"). – hurikhan77

+0

J'ai déjà manqué alias_method_chain, et c'est parti depuis environ un mois –

+0

@MattBriggs De quoi parlez-vous? Il est toujours là depuis 4.0.2: http://apidock.com/rails/Module/alias_method_chain – Chloe

0

Je pense que vous avez besoin d'ouvrir la méthode

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

Essayez ceci:

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

Le titre de votre question est trompeur. Franchement, je pense que vous voulez probablement personnaliser la structure de la liste de pages will_paginate, ce qui peut être fait différemment.

Donc, dans votre cas, la bonne façon est d'étendre le moteur de rendu. Par exemple charger les éléments suivants d'un initialiseur (via config/initializers):

class CustomPaginationRenderer < WillPaginate::LinkRenderer 

    def to_html 
    # Your custom code, debugger etc 
    end 

end 

Ensuite, d'avoir votre application utiliser ce moteur de rendu ajouter ce qui suit à votre fichier de configuration/environment.rb:

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