Le remplacement d'un module de méthode à partir d'un joyau dans les Rails
La will_paginate gem est cassé sur ma version d'Oracle. La valeur par défaut paginate_by_sql
méthode dans le WillPaginate module est l'insertion d'un supplément de "COMME" dans une requête et le faire échouer.
Le code lui-même est facilement résolu, mais je ne suis pas sûr de la meilleure façon d'obtenir des Rails pour ramasser mon changement.
Je ne veux pas changer le code dans la pierre elle-même, comme cela va laisser mon code cassé sur d'autres machines.
J'ai essayé de créer une lib/test.rb fichier contenant:
module WillPaginate
def paginate_by_sql
(my code goes here)
end
end
et demandant de l'environnement.rb, mais ce n'est pas de ramasser mes modifications.
J'ai aussi essayé l'obligeant à partir de contrôleurs/de l'application.rb, mais encore une fois, de ne pas décrocher de mes modifications.
Temporairement, je l'ai eu à travailler par la substitution de la méthode dans le modèle lui-même, mais c'est un peu un hack, et signifie que je ne peux pas l'utiliser sur les autres modèles dans ce projet.
Je suis sûr qu'il ya un moyen facile de faire cela, mais je ne suis pas du tout avoir la chance de suivi vers le bas à l'aide de Google.
- Si la gemme code est cassé, sûrement, il est cassé de partout? Avez-vous enregistré un bug avec le projet? wiki.github.com/mislav/will_paginate/report-bugs
- Pas encore le bug est dans un bloc de manutention oracle des cas spécifiques. La cause est parce que je suis en utilisant le oracleenhanced (plutôt que de l'oracle ou bec) de l'adaptateur. Je pense que la plupart des ppl sont à l'aide de l'oracle de l'adaptateur et ne pas être en cours d'exécution dans le présent) se connectera bug peu de temps de toute façon.
Vous devez vous connecter pour publier un commentaire.
Ce que vous faites au travail, mais votre code doit ressembler à ceci:
En d'autres termes, allez dans le finder.rb, supprimer tout sauf le module en-têtes et la méthode que vous souhaitez remplacer, puis de les enregistrer dans un fichier dans le répertoire lib et de l'inclure dans l'environnement.rb. Voila, instant monkey patch!
config/initializers
- ne pas mettre cela dans laenvironment.rb
fichier!Plus concis solution:
Mettre le code dans un initialiseur fichier de config/initializers. C'est le bon endroit pour mettre le code qui doit être exécuté lorsque l'environnement est chargé. Il est aussi mieux organise votre code, de sorte que chaque fichier de l'intention plus claire, donc les bugs seront plus faciles à repérer. Ne pas encombrer l'environnement.rb!
autoload
: stackoverflow.com/questions/8736451/...paginate_by_sql
, puis-je accéder à son ancienne version? Puis-je appeler quelque chose commesuper(sql, options)
?Ok, je vais me contenter de cela plus facile pour les gens qui, comme moi, viennent et se battent encore un peu après avoir lu les autres réponses.
Première trouver le code que vous souhaitez modifier sur le dépôt github par la recherche de la ligne de code (vous pouvez facilement trouver ce à l'aide de levier) que vous voulez modifier dans la gemme, puis en sélectionnant
Code
sur la gauche, au lieu deIssues
Prochaine Copier le contenu du module que vous souhaitez modifier et de le placer dans une bien nommé
.rb
fichier à l'intérieur de votre config/initializers dossier. Voici un exemple:Maintenant, à le modifier:
Maintenant, apporter des modifications supplémentaires dans le code et de redémarrer le serveur.
Vous allez loin!