Agregar lib a ‘config.autoload_paths’ en Rails 3 no carga automáticamente mi módulo

Coloco un nombre de archivo g.rb en la carpeta lateral Rails.root/lib El contenido del archivo es el siguiente:

 module Google end 

Luego agrego

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

a mi Rails.root/config/application.rb

Sin embargo, cuando bash invocar a Google desde la rails console , se lanza una excepción. La excepción desaparece solo si ejecuto require 'google' . ¿Por qué? ¿No debería mi archivo cargarse automáticamente y no debería acceder al módulo sin ninguna statement adicional?

Hmm, descubrí algo interesante. Para que Rails cargue automáticamente mi clase, el nombre de la clase debe ser compatible con el nombre del archivo y la estructura de la carpeta. Por ejemplo, si quiero que el módulo de Google esté google.rb automáticamente, debo colocarlo dentro de google.rb , directamente debajo de / lib (en caso de que especifique autocarga de / lib). Si quiero cargar automáticamente Google::Docs , lo google.rb dentro de google.rb o google/docs.rb

Tuve un problema similar al hacer que mi módulo se ejecutara en Heroku. Además de la convención de nomenclatura de autocargador establecida por Stephen C, descubrí que el código del módulo debe ser require debido a una suposición de fabricación de threadsafe realizada por el entorno de producción de Rails en Heroku (aunque el threadsafe se comentó en mi production.rb archivo de configuración.) Tan pronto como solicité el archivo del módulo antes de llamar include en el módulo, todo comenzó a funcionar.

 require 'mymodule' include Mymodule 

Por favor, eche un vistazo a este excelente artículo sobre el tema de obtener módulos para cargar correctamente en Heroku (producción).

Eso es porque el punto de autocarga no es ‘exigir’ todo por adelantado (penalización de inicio). Las clases se cargan cuando se necesitan / referencian. Para hacer esto, necesitas alguna forma de saber dónde buscar la clase. De lo contrario, tendría que cargar todos los archivos en el directorio de carga automática de antemano para ver qué clases están declaradas. Es una compensación, pero requiere todo por adelantado (como sugiere marbaq) no es automático. Puede usar el comando autoload proporcionado por Ruby, que toma dos argumentos, el módulo para cargar (simbolizado, es decir: Google en su caso), y el segundo argumento es el nombre del archivo, que sería g.rb si lib está en su ruta de carga ($ :). Consulte los documentos de Ruby para autocarga.

Cambie config.autoload_paths a config.eager_load_paths

(basado en Rails issue # 6850 y Force reload! from lib directory en la consola rails 3.2 )

Me enfrenté al mismo problema en este momento, y mi “solución” (o mejor dicho, solución alternativa) fue solicitar manualmente todos los archivos necesarios de Rails.root / lib en mi application.rb.

 require 'lib/message' require 'lib/store' require 'lib/vault/vault.rb' require 'lib/custom_loggers' module MyApplication class Application < Rails::Application 

Mi siguiente paso sería categorizar los archivos en las carpetas del módulo como mencionas.

encontré esta solución recientemente

config / application.rb

 module AppName class Application < Rails::Application # Custom directories with classes and modules you want to be autoloadable. config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**}')] config.autoload_paths += Dir[Rails.root.join('app', 'lib', 'extensions')] end end 

la primera llamada de configuración induce que los Rails carguen automáticamente todos los subdirectorios del directorio de aplicaciones / modelos, así que ahora puedo tener /app/models/sub_directory/model.rb autocargado (útil para organizar una aplicación con una gran base de código)

la segunda llamada de configuración induce raíles para autocargar el directorio lib / extensions

espero que esto ayude

nota: creo que esto es carriles 3 específicos