ruby – 如何仅在某些路径上使用Rack中间件?

我想让MyMiddleware在我的Rack应用程序中运行,但只能用于某些路径.我希望使用Rack :: Builder或至少Rack :: URLMap,但我不太清楚如何.

这是我以为会工作,但不是:

# in my rackup file or Rails environment.rb:
map '/foo' do
  use MyMiddleware,{ :some => 'options' }
end

或者更好的是,使用Regexp:

map /^foo/ do
  use MyMiddleware,{ :some => 'options' }
end

但地图似乎要求一个应用程序结束;它不会回到刚刚传递控制回到其父母. (实际的错误是“undefined方法”,每个“for nil:NilClass”从Rack尝试将end的结尾转到一个应用程序.)

那里有一个中间件需要一系列的中间件和一个路径,只有在路径匹配的情况下才能运行它们?

解决方法

您可以让MyMiddleware检查路径,如果匹配,则不会将控件传递给下一个中间件.
class MyMiddleware
  def initialize app
    @app = app
  end
  def call env
    middlewary_stuff if env['PATH_INFO'] == '/foo'
    @app.call env
  end

  def middlewary_stuff
    #...
  end
end

或者,您可以使用URLMap w / o的dslness.它看起来像这样:

main_app = MainApp.new
Rack::URLMap.new '/'=>main_app,/^(foo|bar)/ => MyMiddleWare.new(main_app)

URLMap实际上是pretty simple to grok.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...