2010-03-28 100 views
4

我想写两种机架路由。机架让我们写像这样这样的路线:机架URL映射

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

在我的情况,我想处理这些路线:

  • “/”或“指数”
  • “/ *”号为了匹配任何其他途径

所以我想这样的:

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

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

感谢

回答

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