2013-04-25 79 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