2011-06-08 11 views
8

Quiero escribir una gema que agregue un directorio app/services a una aplicación Rails.Agregar a carriles autoload_path de Gem

ya que quiero añadir que desde el interior de la joya que ocurrió con esta solución:

class Railtie < ::Rails::Railtie 
    config.after_initialize do |app| 
    ::Rails.logger.info "adding #{ActiveService::Configuration.path} to autoload_path" 
    app.config.autoload_paths = [ActiveService::Configuration.path] + app.config.autoload_paths 
    end 
end 

El problema es que config.autoload_path es una matriz congelada, de modo que modifing parece no ser una buena idea.

¿Alguna sugerencia de cómo se podría lograr esto de una mejor manera?

Respuesta

11

config.autoload_paths está congelado dentro del :set_autload_paths initializer. La matriz se transfiere a ActiveSupport::Dependencies.autoload_paths, por lo que modificar la matriz original no tendría mucho sentido. Por lo tanto, está congelado.

Usted debe ser capaz de enganchar en :before => :set_autoload_paths y extender config.autoload_paths antes de que sea aprobada y congelados:

class Railtie < ::Rails::Railtie 
    initializer 'activeservice.autoload', :before => :set_autoload_paths do |app| 
    app.config.autoload_paths << ActiveService::Configuration.path 
    end 
end 

Documentación sobre ganchos de inicializador se puede encontrar en guides.rubyonrails.org/initialization.html

+0

este enfoque parece prometedor, pero desafortunadamente no funciona! parece que '' 'app.config''' es diferente de la configuración que se usa dentro de la clase de motor. Actualmente estoy atascado con el uso del enlace '' 'before_configuration''' de railtie, que puede establecer la matriz autoload_paths, pero se ejecuta antes que todos los demás inicializadores. entonces necesito poner cualquier configuración en un archivo yml. – phoet

+0

no sabía que había motores involucrados. ¿hay un repositorio actualizado para probar esto? – rubiii

+0

seguro: https://github.com/phoet/active_service – phoet

4

En primer lugar, todos los directorios bajo APP/* son ya en la ruta de carga desde Rails 3.0. En cualquier caso, si quieres hacerlo, debes usar las rutas api en su lugar. Ejemplo de código fuente de Rails:

https://github.com/rails/rails/blob/master/railties/lib/rails/engine/configuration.rb#L42

+0

te refieres a '' 'app.config.paths.add" lib/services ",: eager_load => true''' en lugar de agregarlo directamente a autoload_paths? mi problema es que esto solo funciona en el gancho '' 'before_configuration'''. Al agregarlo a las rutas en cualquier otro inicializador se ignoran los cambios y las clases no se cargan. – phoet