Sé que ha pasado mucho tiempo desde que se hizo esta pregunta por primera vez, pero tengo una respuesta adicional que quiero compartir.
Tengo varias aplicaciones Ruby que fueron desarrolladas por otro programador durante varios años, y reutilizan las mismas clases en las diferentes aplicaciones aunque pueden acceder a la misma base de datos. Dado que esto viola la regla DRY, decidí crear una biblioteca de clases para ser compartida por todas las aplicaciones de Ruby. Podría haberlo puesto en la biblioteca principal de Ruby, pero eso ocultaría el código personalizado en la base de código común que no quería hacer.
Tuve un problema donde tuve un conflicto de nombre entre un nombre ya definido "profile.rb" y una clase que estaba usando. Este conflicto no fue un problema hasta que intenté crear la biblioteca de código común. Normalmente, Ruby busca primero las ubicaciones de las aplicaciones y luego va a las ubicaciones $ LOAD_PATH.
Application_controller.rb no pudo encontrar la clase que creé y arrojó un error en la definición original porque no es una clase. Desde que eliminé la definición de clase de la sección de aplicación / modelos de la aplicación, Ruby no pudo encontrarla allí y fue a buscarla en las rutas de Ruby.
Entonces, modifiqué la variable $ LOAD_PATH para incluir una ruta al directorio de la biblioteca que estaba usando. Esto se puede hacer en el archivo environment.rb en el momento de la inicialización.
Incluso con el nuevo directorio agregado a la ruta de búsqueda, Ruby arrojaba un error porque preferentemente tomaba primero el archivo definido por el sistema. La ruta de búsqueda en la variable $ LOAD_PATH busca preferentemente las rutas de Ruby primero.
Entonces, necesitaba cambiar el orden de búsqueda para que Ruby encontrara la clase en mi biblioteca común antes de buscar en las bibliotecas integradas.
Este código lo hizo en el archivo environment.rb:
Rails::Initializer.run do |config|
* * * * *
path = []
path.concat($LOAD_PATH)
$LOAD_PATH.clear
$LOAD_PATH << 'C:\web\common\lib'
$LOAD_PATH << 'C:\web\common'
$LOAD_PATH.concat(path)
* * * * *
end
No creo que pueda usar ninguna de las construcciones de codificación avanzadas proporcionadas antes en este nivel, pero funciona bien si desea configurar algo en el momento de la inicialización en su aplicación. Debe mantener el orden original de la variable $ LOAD_PATH original cuando se vuelve a agregar a la nueva variable; de lo contrario, algunas de las clases principales de Ruby se perderán.
En el archivo application_controller.rb, simplemente uso un
require 'profile'
require 'etc' #etc
y esto carga los archivos de biblioteca personalizados para toda la aplicación, es decir, no tengo que usar comandos require en cada controlador.
Para mí, esta era la solución que estaba buscando y pensé en agregarla a esta respuesta para transmitir la información.
File.expand_path(File.dirname(__FILE__)).tap {|pwd| $LOAD_PATH.unshift(pwd) unless $LOAD_PATH.include?(pwd)}