我已經構建了一個rails插件,並且它需要構建一些文件才能正常工作。用戶可以將其作爲rake任務手動啓動,但爲了方便開發,我希望在刷新瀏覽器時添加重新運行此版本的選項。在重新加載Rails插件時運行任意代碼
爲了清楚起見,我不想每次刷新重新加載插件,也不想重新加載其他任何ruby文件。每次Rails決定重新加載它的庫時,我都想運行一些任意的ruby代碼。
我已經構建了一個rails插件,並且它需要構建一些文件才能正常工作。用戶可以將其作爲rake任務手動啓動,但爲了方便開發,我希望在刷新瀏覽器時添加重新運行此版本的選項。在重新加載Rails插件時運行任意代碼
爲了清楚起見,我不想每次刷新重新加載插件,也不想重新加載其他任何ruby文件。每次Rails決定重新加載它的庫時,我都想運行一些任意的ruby代碼。
我遇到了這個解決方案,這有點更重要。
ActionDispatch::Callbacks.to_prepare do
Rails.logger.warn "Look at me I'm updating!"
end
解決方案一:
您必須添加:
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目錄確保一切都被加載。
對我來說第二個解決方案工作 – 2013-04-25 08:16:06
沒錯。自動加載正在重新加載文件,我不必在那裏只放入類,我可以放入立即執行的代碼。這對我來說非常愚蠢。我喜歡前者,因爲它會將其留在軌道上以找出何時在沒有條件的情況下運行代碼。謝謝! – trevorgrayson 2013-04-25 12:57:33
@rovertus,謝謝! – 2013-04-25 13:08:05