Comment puis-je obtenir Rails pour arrêter Rechargement mes bijoux?
-
19-09-2019 - |
Question
J'ai un petit bijou:
# in /Library/Ruby/Gems/1.8/gems/my_gem-1.0.0/lib/my_gem.rb
module MyGem
def do_stuff
..
end
end
Et je chargé dans Rails:
# in [rails_root]/config/environment.rb:
config.gem 'my_gem', :version => '1.0.0'
Et utilisé:
# in [rails_root]/app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
include MyGem
end
Mais je dois singe-patch un peu de manière spécifique à l'environnement:
# in [rails_root]/config/environments/development.rb:
MyGem.class_eval do
def do_stuff
raise 'Ack! - just testing'
end
end
Malheureusement, rechargements de MyGem
sur chaque demande, donc mon singe ragréage est inutile.
J'ai vérifié load_once_paths
:
ActiveSupport::Dependencies.load_once_paths
# => ["/Library/Ruby/Gems/1.8/gems/my_gem-1.0.0/lib", "other stuff"]
Toute idée comment je peux obtenir l'effet que je veux?
La solution
Semble que vous travaillez en mode de développement où Rails charge toutes les classes dans chaque demande d'aider le développeur à refléter le code change + vous avez inclus la pierre précieuse dans votre contrôleur. Pour remédier à ce rendez-vous à project_path / config / environnements / development.rb et ajoutez cette ligne
config.cache_classes = true
Notez que vous n'aurez pas vos modifications de code réfléchi à moins que vous redémarrez le serveur.
Mise à jour 1 : De plus comme une deuxième solution, vous pouvez ajouter le patch Moneky après que vous vous incluez la pierre précieuse dans ce contrôleur. Vous pouvez l'ajouter au fond de votre fichier contrôleur.
Mise à jour 2 : Une troisième solution (recommandé) Si vous pouvez ajouter l'extrait suivant à my_gem.rb
class ActionController::Base
include MyGem
end
alors les choses devraient fonctionner comme vous ne aurez pas besoin d'inclure manuellement dans votre contrôleur d'application.
Autres conseils
Si vous incluez la pierre précieuse dans votre environment.rb
vous ne devriez pas avoir de l'inclure dans votre contrôleur.
Vous voudrez peut-être penser à la façon dont les crochets de pierres précieuses dans ActionController - il semble que vous voulez ajouter des méthodes de classe à ActionController :: Base, ce qui est assez simple. Jetez un oeil à combien de pierres précieuses communes mettre en œuvre.
Il semble aussi, comme vous pouvez même vérifier l'existence et la valeur de RAILS_ENV
pour assurer un comportement différent pour différents environnements.