2012-03-24 75 views
3

我在軌lib文件夾裏面的一些模塊,而不重新啓動開發服務器LIB文件,即:刷新用Rails 3.1

/lib目錄/ MyApp的/ lib目錄/ **

我的工作他們在開發,但每次我都必須重新啓動服務器。我已經通過了一些關於SO的不同的問題,但其中大部分都是不適合的。3.1

我目前有一個初始化程序可以做到這一點;

if Rails.env == "development" 
    lib_reloader = ActiveSupport::FileUpdateChecker.new(Dir["lib/**/*"], true) do 
    Rails.application.reload_routes! # or do something better here 
    end 

    ActionDispatch::Callbacks.to_prepare do 
    lib_reloader.execute_if_updated 
    end 
end 

if Rails.env == "development" 
    lib_reloader = ActiveSupport::FileUpdateChecker.new(Dir["lib/myapp/lib/*"], true) do 
    Rails.application.reload_routes! # or do something better here 
    end 

    ActionDispatch::Callbacks.to_prepare do 
    lib_reloader.execute_if_updated 
    end 
end 

有沒有一種通用的方法來做到這一點?它非常耗時,不得不每次都重新啓動服務器!

回答

13

擺脫初始化,並在你的application.rb中的文件把下面一行:

config.autoload_paths += Dir["#{config.root}/lib/**/"] 

有一點需要注意的是,你的模塊和類名應遵循自動重載工作的命名約定。例如,如果您有文件的lib/MyApp的/ cool.rb,那麼你在cool.rb類/模塊聲明常量應該是這樣的:

Myapp::Cool 

如果你有文件的lib/MyApp的/ lib目錄/冷。 Rb和你希望使用的酷類/模塊的名稱,而不是MYAPP ::庫::酷那麼你的自動加載應該是這樣的:

config.autoload_paths += Dir["#{config.root}/lib/myapp/lib/**/"] 

只要你在DEVMODE運行,軌道會自動重新加載所有類/模塊都處於自動加載路徑並遵循命名約定。

2

加入application_controller.rb或你的基地控制器:

before_filter :dev_reload if Rails.env.eql? 'development' 

    def dev_reload 
    # add lib files here 
    ["rest_client.rb"].each do |lib_file| 
     ActiveSupport::Dependencies.load_file lib_file 
    end 
    end 

爲我工作。