什么是“地图”在Rack中完全匹配?

时间:2017-01-27 14:50:04

标签: ruby-on-rails ruby rack

说我在Rack中有这个:

map '/great' do
  run Test.new
end

此网址效果很好:site.com/great/stuff但不是:site.com/greatstuff。我已经读过map应该匹配任何与arg名称一起出现的东西,但是这种情况似乎并非如此。

是否有关于其工作原理的详细说明?

1 个答案:

答案 0 :(得分:6)

混乱似乎是概念性的。

它与/great开头的 路径 匹配。那是/great/great//great/stuff等等。 它没有做的是从/great开始匹配 字符串 。与/greatstuff一样。

/greatstuff/great是完全不同的路径。将路径视为树结构。

无法与准系统map AFAIK进行“字符串路径匹配”,但您可以添加自己的机架中间件,查看请求路径并进行相应的调度。

如果您想仔细检查实施情况,请参阅以下两个相关位置:12

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

这基本上创建了一个路径的正则表达式,该路径需要一个字符串以该路径开始(忽略多个/)才能匹配。又名:

to_regex('/foo/bar') # => /^\/+foo\/+bar(.*)/n

如果您想知道,n标志将编码设置为ASCII。

如果字符串匹配,则执行更多检查。即,匹配路径的其余部分要么不存在,要么以/开头。后者可确保您不会将/greatstuff/great匹配,因为stuff不会以/开头。

next unless !rest || rest.empty? || rest[0] == ?/