2011-06-08 26 views
8

我想寫一個gem,將app/services目錄添加到Rails應用程序。從Gem中添加到Rails autoload_path

因爲我想將它從寶石中添加我想出了這個解決方案:

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是凍結的數組,所以對矯正它似乎不是一個好主意。

有關如何以更好的方式實現這一點的任何建議?

回答

11

config.autoload_paths被凍結在:set_autload_paths initializer內。數組傳遞到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

+0

這種方法看起來很有希望,但不幸的是它不工作!它看起來像'''app.config''與引擎類中使用的配置不同。我目前堅持使用railtie'''before_configuration'''鉤子,它可以設置autoload_paths數組,但可以在所有其他初始化器之前運行。所以我需要將任何配置放入一個yml文件。 – phoet 2011-06-20 19:33:53

+0

不知道有涉及引擎。有沒有一個最新的存儲庫來測試呢? – rubiii 2011-06-20 20:14:34

+0

sure:https://github.com/phoet/active_service – phoet 2011-06-23 09:23:48

4

首先可以發現,所有的目錄已經在Rails 3.0以後的加載路徑中。無論如何,如果你想這樣做,你應該使用路徑API來代替。從Rails的源代碼示例:

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

+0

你的意思是像'''app.config.paths.add「lib/services」,:eager_load => true'''而不是直接將它添加到autoload_paths?我的問題是,這隻適用於'''''before_configuration''鉤子。將它添加到每個其他初始化程序的路徑中都會忽略更改,並且不會加載類。 – phoet 2011-06-21 07:16:26

相關問題