J'ai un petit bijou:Comment puis-je faire en sorte que Rails cesse de recharger mes gemmes?
# 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 l'ai 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 en un moyen 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, MyGem
recharge à chaque requête, donc mon patch de singe 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?
Je suis _requiring_ it (implicitement) dans environment.rb; Je suis _including_ dans ApplicationController. Ce sont des actions très différentes. Ce que je me demande, c'est pourquoi Rails recharge la gemme chaque fois qu'il recharge ApplicationController. La preuve qu'il le fait est que mon patch de singe disparaît. –