2010-11-01 2 views
15

Ho una classe ConstData:Rails 3 autoload

class ConstData 

    US_CITIES = ['miami', 'new york'] 

    EUROPERN_CITIES = ['madrid', 'london'] 

end 

suo conservati in /lib/const_data.rb

L'idea è che all'interno di un modello, di controllo o vedere quello che posso fare:

ConstData::US_CITIES per ottenere l'US_CITIES ecc

Rails dovrebbe caricarsi automaticamente questa classe, ho ottenuto questo da: http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/662abfd1df9b2612?hl=en

Tuttavia, questo non funziona. Qualcuno può spiegarmi come farlo?

risposta

48

Il post @daniel si riferisce a dal 2008. Le rotaie sono cambiate da allora.
In effetti, abbastanza di recente. Rails3 non carica automaticamente la cartella lib /.

Tuttavia è possibile riattivarlo facilmente. Aprire config/application.rb E aggiungere, nella configurazione (nella classe Application) il followin:

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

Allora la vostra lib/dir sarà caricato automaticamente.

+0

Grazie signore, io accetto in 6 minuti. Comunque puoi dirmi anche come controllare cosa c'è nel tuo percorso di caricamento automatico? – daniel

+2

<< YourApplication >> :: Application.config.autoload_paths –

+5

Avvertenza!Molti dei tipi di moduli che si possono avere in/lib hanno le informazioni di configurazione impostate negli inizializzatori e tali informazioni di configurazione verranno eliminate quando il modulo viene ricaricato, causando insuccessi inesplicabili nello sviluppo di cose che funzionano bene nei test e nella produzione. La soluzione è aggiungere il percorso/lib a config.autoload_once_paths anziché a config.autoload_paths. –

2

config.autoload_paths non ha funzionato per me. Ho risolto inserendo la seguente in ApplicationController:

Dir["lib/**/*.rb"].each do |path| 
    require_dependency path 
end 
12

Le autoload_paths ragione non ha funzionato per voi e tu eri costretto a fare:

Dir["lib/**/*.rb"].each do |path| 
    require_dependency path 
end 

è perché si è dimenticato di namespace tua classe .

lib/impressionante/stuffs.rb dovrebbe contenere una classe/modulo come questo:

class/module Awesome::Stuffs 
.... 

ma si doveva:

class/module Stuffs 
.... 

rotaie possono solo classi autoload e moduli il cui nome corrisponde è percorso del file e nome del file.

:)

+0

Nice. Questo non aveva menzionato prima e mi ha causato molti problemi. Perché il percorso di caricamento corrisponda se ho un nome composto come nome del modulo cosa dovrei fare? (vale a dire lib/monkey_man/engine.rb -> module MonkeyMan :: Engine?) Si rileva automaticamente? – Vivek

1

Seguire la soluzione per dir lib essere caricata automaticamente:

Rimuovere config.threadsafe! da development.rb e production.rb;

Aggiungi a config/application.rb:

config.autoload_paths += %W(#{config.root}/lib) 
config.threadsafe! 
config.dependency_loading = true 
+0

Grazie. Ho aggiunto 'confing.threadsafe!' In una serie di modifiche per cercare di far funzionare wicked_pdf e questo è stato il motivo per cui il mio carico automatico ha smesso di funzionare. – TheRightChoyce