La suppression d'un procédé de module à partir d'un bijou dans Rails
-
06-09-2019 - |
Question
Le joyau will_paginate est cassé sur ma version d'Oracle. La méthode de paginate_by_sql
par défaut dans le module WillPaginate est l'insertion d'un extra « AS » dans une requête et l'amenant à l'échec.
Le code lui-même est facilement corrigé, mais je ne suis pas sûr de la meilleure façon d'obtenir Rails pour ramasser mon changement.
Je ne veux pas changer le code dans la pierre elle-même, qui laissera mon code cassé sur d'autres machines.
J'ai essayé de créer un fichier lib / test.rb contenant:
module WillPaginate
def paginate_by_sql
(my code goes here)
end
end
et lui demandant de environment.rb, mais il ne ramasser mes changements. J'ai essayé aussi l'obligeant des contrôleurs / application.rb, mais encore une fois, ne pas ramasser mes modifications.
temporairement, je l'ai à travailler en redéfinissant la méthode dans le modèle spécifique lui-même, mais cela est un peu un hack, et signifie que je ne peux pas l'utiliser sur l'un des autres modèles dans ce projet.
Je suis sûr qu'il ya un moyen facile de le faire, mais je ne suis pas avoir de chance de suivi vers le bas en utilisant Google.
La solution
Qu'est-ce que vous faites fonctionne, mais votre code doit ressembler à ceci:
module WillPaginate
module Finder
module ClassMethods
def paginate_by_sql(sql, options)
# your code here
end
end
end
end
En d'autres termes, allez dans finder.rb, supprimer tout sauf les en-têtes de module et la méthode que vous souhaitez remplacer, puis enregistrez un fichier dans le répertoire lib et inclure dans environment.rb. Le tour est joué, patch singe instantané!
Autres conseils
Une solution plus concise:
WillPaginate::Finder::ClassMethods.module_eval do
def paginate_by_sql sql, options
# Your code here
end
end
Mettre le code dans un fichier initialiseur dans config / initializers. Ceci est le bon endroit pour mettre le code qui doit être exécuté lorsque l'environnement est chargé. Il a également mieux organiser votre code, font l'intention de chaque fichier plus clair, donc les bugs seront plus faciles à trouver. Ne pas encombrer environment.rb!
Ok, je vais juste rendre cela plus facile pour les gens comme moi qui viennent vivoter et encore un peu après avoir lu les autres réponses.
Première trouver le code que vous voulez changer sur le repo github en recherchant la ligne de code (vous pouvez facilement trouver cela en utilisant pry ) que vous voulez changer dans la pierre, puis en sélectionnant Code
à gauche au lieu de Issues
Suivant Copiez le contenu du module que vous voulez changer et placez-le dans un fichier .rb
porte bien son nom à l'intérieur de votre dossier config / initializers. Voici un exemple:
module Forem
module TopicsHelper
def link_to_latest_post(post)
text = "#{time_ago_in_words(post.created_at)} #{t("ago_by")} #{post.user}"
link_to text, forum_topic_path(post.topic.forum, post.topic, :anchor => "post-#{post.id}")
end
end
end
Maintenant, changez à:
Forem::TopicsHelper.module_eval do
def link_to_latest_post(post)
text = "#{time_ago_in_words(post.created_at)} #{t("ago_by")} #{post.user}"
link_to text, forum_topic_path(post.topic.forum, post.topic, :anchor => "post-#{post.id}")
end
end
Maintenant, apporter des modifications supplémentaires au code et redémarrez votre serveur.
vous partez!