2012-02-12 17 views
8

Come è possibile forzare il ricaricamento di una gemma per ogni richiesta?Come ricaricare gem per ogni richiesta in Rails 3.2?

Sviluppo una gemma e vorrei ricaricare il codice della mia gemma ogni volta che aggiorno la pagina in un browser. My Gemfile:

gem "my_gem", :path => "../my_gem" 

Per risolvere il problema, ho provato tutti i suggerimenti elencati in stakoverflow. Niente ha aiutato. Inoltre hanno trovato due parametri di configurazione di Rails: watchable_dirs e watchable_files. Ho cercato di usarli ma anche loro non funzionano per me.

+3

Qualcuno deve chiedere: * Perché? * Che problema stai cercando di risolvere? –

+4

@Jordan la domanda è ovvia: perché sta sviluppando una gemma, vuole cambiare e debuggarlo senza problemi. – apneadiving

+0

Immagino che dovresti richiedere al tuo gem un'istruzione 'to_prepare' nel suo file di inizializzazione, vedi http://guides.rubyonrails.org/configuring.html#initialization-events – apneadiving

risposta

2

È necessario contrassegnare le classi che si desidera ricaricare come scaricabili utilizzando il metodo ActiveSupport :: Dipendenze scaricabili;

class YourClass 
    unloadable 
end 

http://apidock.com/rails/ActiveSupport/Dependencies/Loadable/unloadable e http://robots.thoughtbot.com/post/159805560/tips-for-writing-your-own-rails-engine

dovrebbe darvi alcuni retroscena. In alternativa puoi fare il tuo stesso ricaricamento in questo modo;

Object.send(:remove_const, 'YOUR_CLASS') if Object.const_defined?('YOUR_CLASS') 
GC.start 
load 'path/to/your_file.rb' 
+0

il problema è che io costruisco un modulo e poi lo includo in ActionView: 'ActionView :: Base.send: include, MyGem :: Helper'. Quindi non ho lezioni. In questo caso dovrei usare il metodo 'non caricabile'? – Vadim

+0

Perfetto, questo ha risolto il problema per me! Ho appena messo "scaricabile se Rails.env.development?" Nel mio modulo, e funziona come un fascino. Grazie! –

2

ho fatto citazione un po 'di caccia in giro per questo, ma alla fine ci sono voluti alcuni tentativi ed errori.

lib/my_gem/my_gem.rb:

require 'active_support/dependencies' 
ActiveSupport::Dependencies.autoload_paths += [File.expand_path("..", __FILE__)] 

module MyGem 
    include ActiveSupport::Dependencies 
    unloadable 
end 

assicurarsi di aggiungere “scarrabile” per tutte le classi pure.