Come faccio ad avere Rails per fermare ri-caricare i miei gioielli?
-
19-09-2019 - |
Domanda
Ho un gioiello:
# in /Library/Ruby/Gems/1.8/gems/my_gem-1.0.0/lib/my_gem.rb
module MyGem
def do_stuff
..
end
end
E ho caricato in Rails:
# in [rails_root]/config/environment.rb:
config.gem 'my_gem', :version => '1.0.0'
E usato:
# in [rails_root]/app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
include MyGem
end
Ma ho bisogno di scimmia-patch è un po 'in modo specifico per l'ambiente:
# in [rails_root]/config/environments/development.rb:
MyGem.class_eval do
def do_stuff
raise 'Ack! - just testing'
end
end
Purtroppo, ricariche MyGem
su ogni richiesta, quindi la mia scimmia-patching è inutile.
load_once_paths
Ho controllato:
ActiveSupport::Dependencies.load_once_paths
# => ["/Library/Ruby/Gems/1.8/gems/my_gem-1.0.0/lib", "other stuff"]
Qualsiasi idea di come posso ottenere l'effetto che voglio?
Soluzione
Sembra che si sta lavorando in modalità di sviluppo, dove i carichi Rotaie tutte le classi in ogni richiesta per aiutare lo sviluppatore in modo da riflettere il codice cambia + aver incluso la gemma nel controller. Per superare questo vai project_path / config / ambienti / development.rb e aggiungere questa riga
config.cache_classes = true
Si noti che non sarà necessario le modifiche di codice riflesse a meno che non si riavvia il server.
Aggiorna 1 : Anche come una seconda soluzione è possibile aggiungere la patch moneky dopo si include la gemma in tale controller. È possibile aggiungere alla fine del file di controllo.
Update 2 : Una terza soluzione (consigliato) Se è possibile aggiungere il seguente frammento di my_gem.rb
class ActionController::Base
include MyGem
end
poi le cose dovrebbero funzionare in quanto non sarà necessario includere manualmente nel controllore dell'applicazione.
Altri suggerimenti
Se stai compresa la gemma nella vostra environment.rb
non dovrebbe essere necessario includere nel vostro controller.
Si potrebbe desiderare di pensare a come i ganci gemma in ActionController - che suona come si desidera aggiungere metodi della classe per ActionController :: Base, che è abbastanza semplice. Date un'occhiata a quanti gemme comuni implementano questa.
Sembra troppo, come si potrebbe anche voler verificare l'esistenza e il valore di RAILS_ENV
per garantire un comportamento diverso per ambienti diversi.