ruby-on-rails-3rubygemsload-path

Adding to Rails autoload_path from Gem


I want to write a gem that adds a app/services directory to a Rails application.

Since I want to add it from within the Gem i came up with this solution:

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

The problem is that config.autoload_path is a frozen array, so that modifing it seems not to be a good idea.

Any suggestions of how this could be achieved in a better way?


Solution

  • config.autoload_paths is frozen inside the :set_autload_paths initializer. The Array is passed on to ActiveSupport::Dependencies.autoload_paths, so modifying the original Array would not make much sense. Therefore it's frozen.

    You should be able to hook into :before => :set_autoload_paths and extend config.autoload_paths before it's passed and frozen:

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

    Documentation about initializer hooks can be found at guides.rubyonrails.org/initialization.html