rails instalar ruby-on-rails ruby-on-rails-4

ruby on rails - instalar - Carga automática de archivos lib en Rails 4



ruby jobs (4)

Aunque esto no responde directamente a la pregunta, pero creo que es una buena alternativa para evitar la pregunta por completo.

Para evitar todos los problemas de autoload_paths o eager_load_paths , cree un directorio "lib" o "misc" en el directorio "app". Coloque los códigos como lo haría normalmente allí, y Rails cargará los archivos de la misma manera que cargará (y volverá a cargar) los archivos de modelo.

Utilizo la siguiente línea en un inicializador para cargar automáticamente el código en mi directorio /lib durante el desarrollo:

config / initializers / custom.rb:

RELOAD_LIBS = Dir[Rails.root + ''lib/**/*.rb''] if Rails.env.development?

(de Rails 3 Quicktip: cargue automáticamente las carpetas lib en modo de desarrollo )

Funciona muy bien, pero es demasiado ineficiente para usar en producción. En lugar de cargar libs en cada solicitud, solo quiero cargarlas en el inicio. El mismo blog tiene otro artículo que describe cómo hacer esto:

config / application.rb:

# Custom directories with classes and modules you want to be autoloadable. config.autoload_paths += %W(#{config.root}/lib) config.autoload_paths += Dir["#{config.root}/lib/**/"]

Sin embargo, cuando cambio a eso, incluso en desarrollo, obtengo NoMethodErrors cuando intento usar las funciones lib.

Ejemplo de uno de mis archivos lib:

lib / extensions.rb:

Time.class_eval do def self.milli_stamp Time.now.strftime(''%Y%m%d%H%M%S%L'').to_i end end

Calling Time.milli_stamp lanzará NoMethodError

Me doy cuenta de que otros han respondido preguntas similares en SO, pero todos parecen lidiar con las convenciones de nomenclatura y otros problemas que no me tenían que preocupar antes. Mis clases de lib ya funcionaban para la carga por solicitud, solo quiero cambiarlo para el inicio de carga. ¿Cuál es la forma correcta de hacer esto?


Creo que esto puede resolver su problema:

  1. en config / application.rb :

    config.autoload_paths << Rails.root.join(''lib'')

    y mantener la convención de nomenclatura correcta en lib .

    en lib / foo.rb :

    class Foo end

    en lib / foo / bar.rb :

    class Foo::Bar end

  2. Si realmente quieres hacer algunos parches de mono en un archivo como lib / extensions.rb , puedes solicitarlo manualmente:

    en config / initializers / require.rb :

    require "#{Rails.root}/lib/extensions"

PD


Esto podría ayudar a alguien como yo que encuentra esta respuesta cuando busca soluciones sobre cómo Rails maneja la carga de clases ... Descubrí que tenía que definir un module cuyo nombre coincidiera con mi nombre de archivo adecuadamente, en lugar de solo definir una clase:

En el archivo lib / development_mail_interceptor.rb (Sí, estoy usando el código de un Railscast :))

module DevelopmentMailInterceptor class DevelopmentMailInterceptor def self.delivering_email(message) message.subject = "intercepted for: #{message.to} #{message.subject}" message.to = "[email protected]" end end end

funciona, pero no se carga si no hubiera puesto la clase dentro de un módulo.


Use config.to_prepare para cargar sus parches / extensiones de mono para cada solicitud en modo de desarrollo.

config.to_prepare do |action_dispatcher| # More importantly, will run upon every request in development, but only once (during boot-up) in production and test. Rails.logger.info "/n--- Loading extensions for #{self.class} " Dir.glob("#{Rails.root}/lib/extensions/**/*.rb").sort.each do |entry| Rails.logger.info "Loading extension(s): #{entry}" require_dependency "#{entry}" end Rails.logger.info "--- Loaded extensions for #{self.class}/n"

fin