重新加载rails中间件,而无需在开发中重新启动服务器

我有一个rails 4应用程序,中间件位于lib / some / middleware.rb,它当前通过初始化器注入堆栈,如下所示:

MyApp::Application.configure.do |config| config.middleware.use 'Some::Middleware' end 

不幸的是,每当我改变一些东西,我需要重新启动服务器。 如何在开发模式下的每个请求上重新加载它? 我已经看到类似的问题,关于在to_prepare块中使用自动加载或包装代码重新加载lib代码,但我不确定如何在这种情况下应用它。

谢谢, – FJM

更新#1

如果我尝试删除中间件然后在to_prepare块中重新添加它,我会收到错误“无法修改冻结的数组”。

我认为在某些时候Rails足够聪明,可以在运行时替换中间件代码,但我可能错了。

这就是我想出来的,绕过Ruby类加载疯狂并利用Rails类重新加载。

将中间件添加到堆栈:

 # config/environments/development.rb [...] config.middleware.use "SomeMiddleware", "some_additional_paramter" 

使用自动重新加载,但要确保运行的rails实例和已经初始化的中间件对象“忘记”执行的实际代码:

 # app/middlewares/some_middleware.rb class SomeMiddleware def initialize(*args) @args = args end def call(env) "#{self.class}::Logic".constantize.new(*@args).call(env) end class Logic def initialize(app, additional) @app = app @additional = additional end def call(env) [magic] @app.call(env) end end end 

逻辑上的更改应该通过每次请求上的rails自动重新加载来获取。

我认为这实际上可能成为一个有用的gem!

你能不能简单地使用霰弹枪 ? 如果我理解您的问题,您希望确保在您对代码所做的每项更改中重新加载环境。 这就是猎枪会做的事情。