2015-09-30 31 views
22

Sto lavorando a un'applicazione Rails 4.2 e ho appena aggiunto app/services/fetch_artists.rb alla struttura. All'interno di questo file, ho definito uno class FetchArtists; end.Perché Rails non esegue il caricamento automatico delle classi da app/servizi?

Quando si tenta di eseguire rails r 'FetchArtists' mi dà un NameError: uninitialized constant FetchArtists.

ho provato guardando ActiveSupport::Dependencies.autoload_paths e in effetti, app/services non c'è:

/.../app/assets 
/.../app/controllers 
/.../app/helpers 
/.../app/jobs 
/.../app/mailers 
/.../app/models 
/.../app/controllers/concerns 
/.../app/models/concerns 
/.../spec/mailers/previews 

La mia domanda è, perché questa cartella non viene caricato automaticamente, e cosa devo fare per essere?

EDIT

Molto strano, dopo aver ripetutamente l'esecuzione del comando di cui sopra con rails runner, appare la nuova cartella sui sentieri autoload. Non ho idea del perché sia ​​successo con un tale ritardo.

Qualcuno ha suggerito che questo potrebbe occuparsi di spring. Mi piacerebbe saperne di più su questo, dal momento che può aiutare molti altri anche in questa situazione.

risposta

-2

È necessario includere in autoload_paths:

config.autoload_paths += %W(#{Rails.root}/app/services) 
+4

Da quello che ho capito, tutto direttamente in 'app' viene caricato automaticamente: http://edgeguides.rubyonrails.org/autoloading_and_reloading_constants.html#autoload-paths – linkyndy

+0

@AndreiHorak Ho notato anche questo. Stai usando Rails standard (non Rails-api ad es.)? – dimakura

+0

@AndreiHorak ho l'impressione che sia necessario riavviare il server per il nuovo DIR da aggiungere al percorso di caricamento ... – Joel

0

Devi aggiungerlo alla autoload_paths

In config/application.rb:

config.autoload_paths += %W(#{config.root}/app/services) 
+13

Da quello che ho capito, tutto direttamente sotto 'app' viene caricato automaticamente: http://edgeguides.rubyonrails.org/autoloading_and_reloading_constants.html#autoload-paths – linkyndy

7

Sono venuto con un problema simile, e ha dato una rapida occhiata ai documenti di primavera e trovato questo bit su watchers.

ho aggiunto il seguente alla mia application.rb e le cose cadde in luogo -

Spring.watch "app/services/**" 

Non sono un esperto qui, YMMV.

2

Avevo lo stesso problema e non ho trovato alcuna soluzione. Non sono abbastanza paziente da aspettare il caricamento automatico per caricarlo, quindi la mia soluzione rapida è stata quella di attivare eager_load e avviare il mio server. Alla fine lo caricherà. L'ho spento in seguito e le mie lezioni erano ancora caricate.

Basta usare: config.eager_load = true

nel vostro config/environments/development.rb

33

ho incontrato lo stesso problema e che sembra essere un problema di cache con la Primavera, un processo che gestisce il precaricamento la vostra applicazione. Viene utilizzato per il server Web e per le attività di console e Rake.

Arresto molla con bin/spring stop forzerà Spring per caricare l'app fresca. L'esecuzione di rails console e l'ispezione di ActiveSupport::Dependencies.autoload_paths mostreranno correttamente app/services.

5

Nel mio caso la primavera non stava osservando la directory app/services per le modifiche - il riavvio di Spring avrebbe caricato la classe ma le modifiche a una classe esistente o una nuova classe richiederebbero un riavvio di Spring per la loro applicazione.

Per risolvere questo problema ho aggiunto alla lista delle cartelle controllate entro la primavera in config/spring.rb:

%w(
    .ruby-version 
    .rbenv-vars 
    tmp/restart.txt 
    tmp/caching-dev.txt 
    app/services 
).each { |path| Spring.watch(path) } 

e riavviato primavera ancora una volta.