-->

轨道5互换ActionDispatch :: Reloader使用自定义reloader(Rail

2019-09-30 21:08发布

我们有用于安装模拟引擎本地开发中自定义会话调用中间件通过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)从用于initializeMyModule ,当我启动服务器。 然后我尝试以下

#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的正确方法是什么?

Answer 1:

您需要将您的中间件的附加参数传递给swap呼叫:

app.config.middleware.swap(::ActionDispatch::Reloader, MyModule::CustomReloaderMiddleware, app.reloader)

这时候,给出了相同的说法ActionDispatch::Reloader是第一个加入 -这是应用程序的reloader,这是一个更特别配置的子类为:: Reloader(所以你在正确的轨道上)。



文章来源: Rail 5 swap ActionDispatch::Reloader with a custom reloader