2010-10-25 13 views
14

LA SITUAZIONE:Rails3 Non ricaricare il codice in lib, mentre in modalità di sviluppo

  1. Ho codice in lib/foo/bar.rb con un metodo semplice definiti come tali:

    module Foo 
        class Bar 
        def test 
         "FooBar" 
        end 
        end 
    end 
    
  2. In mio aiuto, , I have:

    require `lib/foo/bar` 
    module FooBarHelper 
        def test_foo_bar 
        fb = Foo::Bar.new 
        fb.test 
        end 
    end 
    
  3. A mio avviso, Io chiamo questo metodo di supporto in questo modo:

    <%= test_foo_bar => 
    
  4. Nel mio config/environments/development.rb, ho aggiunto la directory al mio config.autoload_paths:

    config.autoload_paths += ["#{config.root}/lib/foo"] 
    

IL PROBLEMA :

Wh it Cambio il valore di ritorno di Foo::Bar.test in, ad esempio, "MODIFIED FOOBAR", il valore di ritorno originale, "FooBar", è ancora visualizzato sulla vista e non il nuovo valore.

Dato che sono in modalità di sviluppo, il codice non dovrebbe ricaricare il codice su ogni richiesta?

Qualcuno potrebbe dirmi cosa mi manca?

Grazie!

risposta

9

hanno tolto la cartella radice applicazione in Rails 3.

È possibile aggiungere nuovamente
config.autoload_paths << 'lib' 
oppure è possibile utilizzare `require_dependency` lib nel vostro aiutante.
module FooBarHelper 
    require_dependency 'foo/bar' 

    def test_foo_bar 
    fb = Foo::Bar.new 
    fb.test 
    end 
end 

Entrambi i metodi indicano a Rails che il file lib/foo/bar.rb deve essere caricato automaticamente e successivamente, ricaricato ogni richiesta.

+0

Grazie per la risposta Samuel! Non sto già usando il tuo primo suggerimento? Dovrei usare l'operatore '<<' invece di '+ ='? Pensavo fossero equivalenti. – John

+0

Per il tuo scopo, sono gli stessi. La differenza è che vuoi che 'lib' sia caricato automaticamente per poter trovare il file sorgente' foo/bar.rb' per la costante 'Foo :: Bar'. – Samuel

+0

Ho aggiornato la sezione SITUAZIONE del mio post per rendere più facile la scelta. Vedere la parte 4. – John

-1

Perché stai inserendo il requisito nel modulo, quando usi autoload_path non dovresti aver bisogno del file, dovrebbe funzionare senza, penso che se richiedi manualmente il file in seguito, i binari non sanno quando caricarlo di nuovo?

Qualcosa di simile a questo:

require `bar` 

module FooBarHelper 

    def test_foo_bar 
    fb = Foo::Bar.new 
    fb.test 
    end 

end 

dovrebbe funzionare, non c'è bisogno di avere la richiedono all'interno del modulo.

+0

Grazie per la risposta Max! Apprezzalo! Quindi, come proponi di accedere alla mia lezione di Bar? – John

+0

Ho aggiornato la mia risposta sopra, funziona per voi con il ricaricamento? –

+0

Nessun dado sulla mia parte ... ha fatto questo lavoro per te? – John

2

Il caricamento automatico del codice dalla cartella lib è stato disabilitato intenzionalmente nelle guide3, vedere questo ticket per ulteriori dettagli.

La soluzione suggerita da Samuel è un ottimo inizio, ma ho scoperto che certi ambienti avevano ancora difficoltà a trovare le librerie in un ambiente di test (dire essere invocato da uno scenario di cetriolo), e che tra cui il percorso principale, come suggerito nel il ticket e accennato dal commento originale in application.rb è stato un approccio più robusto:

config.autoload_paths += %W(#{config.root}/lib) 
25

risposte precedenti non funziona. Qui è uno che lavora: http://ileitch.github.com/2012/03/24/rails-32-code-reloading-from-lib.html

Devi usare entrambi:

config.watchable_dirs['lib'] = [:rb] 

e

require_dependency 

ma qualsiasi config.autoload_paths soluzione basata non funziona in Rails ~> 3.2

+3

Sicuramente penso che questa dovrebbe essere la soluzione accettata. Ho passato l'ultima mezz'ora a cercare questo perché caricare automaticamente l'intera dir di 'lib' mi sembrava sporco. – Patrick

+0

Grazie per la risposta, Mike. Il problema è che la prima risposta è stata data nel momento in cui Rails 3.1 era disponibile. Tuttavia, riconosco che la tua risposta è corretta. Ti ho dato un voto ascendente, ma forse potresti creare una nuova domanda per Rails> 3.2 e rispondere da solo. – John

+1

Ho messo 'config.watchable_dirs ['lib'] = [: rb]' in development.rb e nel mio controller ho usato 'require_dependency" my_folder \ my_class "' per fare riferimento alla mia classe in 'lib \ my_folder \ my_class'. Vedi http://apidock.com/rails/v3.2.8/ActiveSupport/Dependencies/Loadable/require_dependency per ulteriori informazioni. –

Problemi correlati