4

我正在尝试编写两种 Rack 路由。Rack 允许我们编写这样的路由:

app = Rack::URLMap.new('/test'  => SimpleAdapter.new,
                       '/files' => Rack::File.new('.'))

就我而言,我想处理这些路线:

  • “/”或“索引”
  • "/*" 以匹配任何其他路由

所以我尝试了这个:

app = Rack::URLMap.new('/index' => SimpleAdapter.new,
                       '/'      => Rack::File.new('./public'))

这很好用,但是......我不知道如何添加“/”路径(作为“/index”路径的替代)。根据我的测试,路径 '/*' 不被解释为通配符。你知道我该怎么做吗?

谢谢

4

1 回答 1

3

您是正确的,Rack::URLMap不会将'*'路径视为通配符。从路径到正则表达式的实际翻译如下所示:

Regexp.new("^#{Regexp.quote(location).gsub('/', '/+')}(.*)", nil, 'n')

也就是说,它将路径中的任何字符视为文字,但也匹配具有任何后缀的路径。我相信您完成尝试的唯一方法是使用中间件而不是端点。在你的config.ru你可能有这样的东西:

use SimpleAdapter
run Rack::File

lib/simple_adapter.rb可能看起来像这样:

class SimpleAdapter
  SLASH_OR_INDEX = %r{/(?:index)?}
  def initialize(app)
    @app = app
  end
  def call(env)
    request = Rack::Request.new(env)
    if request.path =~ SLASH_OR_INDEX
      # return some Rack response triple...
    else
      # pass the request on down the stack:
      @app.call(env)
    end
  end
end
于 2010-06-18T13:39:07.247 回答