Добавление в Rails autoload_path из Gem - PullRequest
8 голосов
/ 08 июня 2011

Я хочу написать гем, который добавляет каталог app/services в приложение Rails.

Поскольку я хочу добавить его из Gem, я пришел к этому решению:

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

Проблема в том, что config.autoload_path - это замороженный массив, поэтому его модификация кажется не очень хорошей идеей.

Какие-либо предложения о том, как этого можно достичь лучше?

Ответы [ 2 ]

11 голосов
/ 18 июня 2011

config.autoload_paths заморожено внутри :set_autload_paths инициализатора .Array передается в ActiveSupport::Dependencies.autoload_paths, поэтому изменение исходного массива не имеет особого смысла.Поэтому он заморожен.

Вы должны иметь возможность подключиться к :before => :set_autoload_paths и расширить config.autoload_paths до того, как он будет передан и заморожен:

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

Документацию о перехватчиках инициализатора можно найти на guides.rubyonrails.org / initialization.html

4 голосов
/ 21 июня 2011

Во-первых, все каталоги в app / * уже находятся в пути загрузки начиная с Rails 3.0. В любом случае, если вы хотите сделать это, вы должны использовать пути api. Пример из исходного кода Rails:

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

...