我正在尝试编写两种 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”路径的替代)。根据我的测试,路径“/*”未被解释为通配符。你知道我该怎么做吗?
谢谢
最佳答案
你是对的,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
关于ruby - Rack URL 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2534327/