我们有用于安装模拟引擎本地开发中自定义会话调用中间件通过Net :: http请求模拟引擎,当请求通过何时处理会话的用例。
当有代码的变化,reloader被触发, 这里调用ActiveSupport::Dependencies
,开始卸货。 然后请求被传递到我们的自定义会话中间件和HTTP请求被触发。 然而,由于HTTP请求调用一个安装引擎,它会再次想到了同样的中间件和reloader再次卸载所有依赖这导致第一重装超时。 因此我们的目标是能够跳过重装第二请求。
我加入了如下代码ActionDispatch::Reloader
这里和它正是我想要的。
class Reloader < Executor
def initialize(app, executor)
super(app, executor)
end
def call(env)
request = ActionDispatch::Request.new(env)
return @app.call(env) if skip_request?(request)
super(env)
end
def skip_request?(request)
request.path_info.start_with?('/session')
end
end
然后,我想使这个清洁想通拉说出来完全以一个模块,并刚做这样的交换从初始化
app.config.middleware.swap(::ActionDispatch::Reloader, MyModule::CustomReloaderMiddleware)
这里是模块
require 'action_dispatch'
module MyModule
class CustomReloaderMiddleware < ActionDispatch::Executor
def initialize(app, executor)
@app, @executor = app, executor
end
def call(env)
request = ActionDispatch::Request.new(env)
return @app.call(env) if skip_request?(request)
super(env)
end
def skip_request?(request)
request.path_info.start_with?('/session')
end
end
end
但是我遇到了一对夫妇的问题。
Uncaught exception: wrong number of arguments (given 1, expected 2)
从用于initialize
在MyModule
,当我启动服务器。 然后我尝试以下
#1
def initialize(app, executor = nil)
@app, @executor = app, executor
end
#2
def initialize(app, executor = nil)
@app, @executor = app, ActiveSupport::Reloader
end
他们都可以正常启动的服务,我看到的要求要通过这个中间件,但它不会重新加载代码..所以我不知道什么是交换ActionDispatch :: Reloader具有自定义reloader的正确方法是什么?