2013-04-25 43 views
0

我已經構建了一個rails插件,並且它需要構建一些文件才能正常工作。用戶可以將其作爲rake任務手動啓動,但爲了方便開發,我希望在刷新瀏覽器時添加重新運行此版本的選項。在重新加載Rails插件時運行任意代碼

爲了清楚起見,我不想每次刷新重新加載插件,也不想重新加載其他任何ruby文件。每次Rails決定重新加載它的庫時,我都想運行一些任意的ruby代碼。

回答

0

我遇到了這個解決方案,這有點更重要。

ActionDispatch::Callbacks.to_prepare do 
    Rails.logger.warn "Look at me I'm updating!" 
end 
2

解決方案一:

您必須添加:

config.autoload_paths += %W(#{config.root}/lib) 

在配置應用程序類/ application.rb中

請參考以下鏈接https://rails.lighthouseapp.com/projects/8994/tickets/5218-rails-3-rc-does-not-autoload-from-lib

另一個一:

更有益嘗試,

新文件:config/initializers/reload_lib.rb

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

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

這是令人厭惡的,但它是一個黑客。可能有更好的方法來觸發完整的重新加載,但這對我很有用。我的具體用例是一個Rack應用程序安裝到Rails路線,因此我需要它在開發過程中重新加載。

基本上它會檢查/lib中的任何文件是否自上次加載後發生更改(修改時間戳),然後在更改時觸發重新加載。

我也可能會提到我有這個在我的config/application.rb

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

剛剛默認情況下,讓我在lib目錄確保一切都被加載。

+0

對我來說第二個解決方案工作 – 2013-04-25 08:16:06

+0

沒錯。自動加載正在重新加載文件,我不必在那裏只放入類,我可以放入立即執行的代碼。這對我來說非常愚蠢。我喜歡前者,因爲它會將其留在軌道上以找出何時在沒有條件的情況下運行代碼。謝謝! – trevorgrayson 2013-04-25 12:57:33

+0

@rovertus,謝謝! – 2013-04-25 13:08:05