2010-01-22 20 views
22

Digamos que tengo que tengo el siguiente archivo en mi directorio lib de mi solicitud rieles:¿Cuándo y dónde necesito archivos en una aplicación de rieles?

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

Si quiero usar ServiceProxy en un modelo, lo puedo usar de esta manera:

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

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

Esto funciona, pero noté que si quiero usar ServiceProxy en otro modelo, no necesito "requerir 'proxy'" en el segundo archivo de modelo. Parece que tener "requerir 'proxy'" una vez en cualquier modelo lo agregará a la ruta de búsqueda.

¿Alguien puede explicar este comportamiento y las mejores prácticas que lo rodean en una aplicación de rieles?

Gracias!

ACTUALIZACIÓN: Sobre la base de la respuesta de Floyd más adelante, si mi archivo ServiceProxy se guardó como así,

#lib/some_service/service_proxy.rb 

entonces yo no tendría que exigir explícitamente el archivo.

Respuesta

12

This es una publicación útil sobre este tema.

En resumen, Rails autocarga las clases en su directorio lib solo si siguen las convenciones de nomenclatura adecuadas.

+0

Muy útil. Siempre había usado la convención de nombres, así que no sabía que no funcionaría si no lo hacía. – Emily

+1

No sé si algo ha cambiado en Rails, pero siempre tengo que agregar esto en config/application.rb antes de que funcione el comportamiento anterior: config.autoload_paths + =% W (# {config.root}/lib) –

+0

Esta publicación es más detallada: http://urbanautomaton.com/blog/2013/08/27/rails-autoloading-hell/ –

4

En general, colocaría esa declaración require en un archivo config/initalizer, p. config/initializers/load_proxy.rb

1

¿Has probado eliminarlo del primer modelo también? Creo que Rails cargará automáticamente todos los archivos que tenga en su directorio lib sin tener que require explícitamente.

0

También tenga en cuenta que algunas de environment.rb vienen con estos comentarios:

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 Autoañadir /lib /vendor /app este directorio en la trayectoria de carga automática. Cuando necesita algunas constantes, necesita solicitar el archivo específico. Y no es necesario que lo solicite la segunda vez, porque sería inútil.

Cuestiones relacionadas