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


Pongo un nombre de archivo g.rb en el lado Rails.root/lib carpeta El contenido del archivo es así:

module Google
end

Luego agrego

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

para mi Rails.root/config/application.rb

Sin embargo, cuando intento invocar a Google desde 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 ningún extra? require ¿declaración?


73
2017-11-02 04:01


origen


Respuestas:


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é cargado automáticamente, debo colocarlo dentro google.rb, directamente en / lib (en caso de que especifique autocarga de / lib). Si quiero carga automática Google::Docs, entonces o lo coloco dentro google.rb o google/docs.rb


113
2017-11-02 04:10



Tuve un problema similar al hacer que mi módulo se ejecutara en Heroku. Además de la convención de nomenclatura de carga automática establecida por Stephen C, descubrí que el código del módulo debe ser requiredebido a un threadsafe asunción hecha por el entorno de producción de Rails en Heroku (aunque threadsafe fue comentado en mi production.rb archivo de configuración.) Tan pronto como yo require'd 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).


27
2017-09-06 05:19



Eso es porque el punto de autocarga es no para '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.


24
2018-01-31 16:22



Cambio config.autoload_paths a config.eager_load_paths

(Residencia en Problema de Rails # 6850 y Fuerza de recarga! desde el directorio lib en la consola Rails 3.2)


7
2017-07-15 19:35



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.


1
2017-11-25 13:20



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 raíles para cargar 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


-5
2018-03-30 02:40