ruby中间件添加堆栈添加中间件

时间:2012-10-02 23:02:50

标签: ruby stack add middleware

我正在尝试在某些请求中添加/附加中间件(在config.ru中)(其中request.path ==“/ hi”)

我试图用Rack :: Builder

来做到这一点

但我似乎失败了。

Rack::Builder.new do
  use added_middleware1
  use added_middleware2
end.call(@env) if @request.path == "/something"

我不确定这是否能解决我的问题。

2 个答案:

答案 0 :(得分:1)

@request变量应仅在发生实际请求时可用,但您发布的代码可能在服务器启动时的配置时运行。 Rack::Builder documentation的首页上有示例代码,显示了如何按照您的意愿执行操作:

app = Rack::Builder.new {
   use Rack::CommonLogger
   use Rack::ShowExceptions
   map "/lobster" do
     use Rack::Lint
     run Rack::Lobster.new
   end
 }

答案 1 :(得分:0)

堆栈看起来应该更像这样:

use CommonMiddleware
map '/something' do
  use SpecialMiddleware
  run TheApp.new
end
map '/' do
  run TheApp.new
end

或者,您可以编写一个中间件来查看请求路径并根据需要运行其他特殊中间件 - 有点像它的包装器。机器看起来像这样:

def initialize app, special_middleware
  @app, @special_middleware = app, special_middleware
end

def call env
  if route_matches?(env)
    @special_middleware.new(@app).call(env) # assumes special_middleware initializer takes no extra parameters
  else
    @app.call(env)
  end
end

def route_matches? env
  # examine the rack environment hash, return true or false
end

使用它的配置如下所示:

use RouteMatchingMiddleware, SpecialMiddleware
run TheApp.new