【问题标题】:Run arbitrary code in a Rails plugin on reload重新加载时在 Rails 插件中运行任意代码
【发布时间】:2013-04-25 05:30:46
【问题描述】:

我已经构建了一个 rails 插件,它需要构建一些文件才能正常工作。用户可以手动将其作为 rake 任务启动,但为了方便开发,我想添加在刷新浏览器时重新运行此构建的选项。

明确一点,我不想每次刷新都重新加载插件,也不想重新加载任何其他 ruby​​ 文件。每次 Rails 决定重新加载它的库时,我都想运行一些任意的 ruby​​ 代码。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 plugins


    【解决方案1】:

    第一个解决方案:

    你必须添加:

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

    在 config/application.rb 中的 Application 类中

    请参考此链接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
    

    这很恶心,但它是一个黑客。可能有更好的方法来触发完全重新加载,但这对我有用。我的具体用例是安装在 Rails 路由上的 Rack 应用程序,因此我需要在开发过程中重新加载它。

    基本上它的作用是检查/lib 中的任何文件自上次加载以来是否发生了变化(修改了时间戳),如果它们发生变化则触发重新加载。

    我可能还会提到我在我的config/application.rb 中有这个

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

    这只是默认情况下确保我的 lib 目录中的所有内容都被加载。

    【讨论】:

    • 对。自动加载正在重新加载文件,我不必只在其中放入类,我可以放入立即执行的代码。这对我来说很愚蠢。我喜欢前者,因为它会让它在没有条件的情况下确定何时运行代码。谢谢!
    【解决方案2】:

    我遇到了这个更重要的解决方案。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      • 2011-07-23
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      相关资源
      最近更新 更多