2010-01-22 13 views
22

Diciamo che ho Ho il seguente file nella mia lib della mia applicazione rotaie:Quando e dove richiedere i file in un'applicazione rota?

#lib/proxy.rb 
module SomeService 
    class ServiceProxy 
    def do_something 
    end 
    end 
end 

Se voglio usare ServiceProxy in un modello, posso usarlo in questo modo:

#app/models/product.rb 
require 'proxy' 

class Product < ActiveRecord::Base 
    def do_something 
    proxy = SomeService::ServiceProxy.new 
    proxy.do_something 
    end 
end 

Funziona, ma ho notato che se si desidera utilizzare ServiceProxy in un altro modello, non è necessario "require 'proxy'" nel secondo file del modello. Sembra che "richiede 'proxy'" una volta in qualsiasi modello lo aggiungerà al percorso di ricerca.

Qualcuno può spiegare questo comportamento e le migliori pratiche che lo circondano in un'applicazione di rotaie?

Grazie!

UPDATE: in base alla risposta del floyd qui sotto, se il mio file ServiceProxy è stato salvato come così,

#lib/some_service/service_proxy.rb 

allora non avrei dovuto richiedere esplicitamente il file.

risposta

12

This è un post utile su questo problema.

In breve, Rails carica automaticamente le classi nella directory lib solo se seguono le convenzioni di denominazione appropriate.

+0

Molto utile. Ho sempre usato la convenzione di denominazione, quindi non sapevo che non avrebbe funzionato se non l'avessi fatto. – Emily

+1

Non so se qualcosa è cambiato in Rails, ma ho sempre bisogno di aggiungerlo in config/application.rb prima che il comportamento sopra funzioni: config.autoload_paths + =% W (# {config.root}/lib) –

+0

Questo post è più dettagliato: http://urbanautomaton.com/blog/2013/08/27/rails-autoloading-hell/ –

4

In genere inserisco le istruzioni necessarie in un file config/initalizer, ad es. config/initializers/load_proxy.rb

1

Hai provato a rimuoverlo anche dal primo modello? Credo che Rails caricherà automaticamente tutti i file che hai nella tua directory lib senza che tu debba mai farlo in modo esplicito con require.

0

Si noti inoltre che alcuni environment.rb di venire con questi commenti:

Rails::Initializer.run do |config| 
    # Add additional load paths for your own custom dirs 
    # config.load_paths += %W(#{RAILS_ROOT}/extras) 
    config.load_paths << "#{RAILS_ROOT}/app/models/some_model_group" 
    config.load_paths << "#{RAILS_ROOT}/lib" 
end 
0

Rails si auto aggiungere /lib /vendor /app questa directory nel percorso caricamento automatico. Quando hai bisogno di alcune costanti, devi richiedere il file specifico. E non è necessario richiederlo la seconda volta, perché sarebbe inutile.

Problemi correlati