Sinatra 自定义路由匹配器
如上显示,Sinatra 内置了对于使用字符串和正则表达式作为路由匹配的支持。但是,它并没有只限于此。你可以非常容易地定义你自己的匹配器:
class AllButPattern
Match = Struct.new(:captures) # :captures键中存放的就是捕获的匹配文本
def initialize(except)
@except = except
@captures = Match.new([])
end
def match(str)
@captures unless @except === str
end
end
def all_but(pattern)
AllButPattern.new(pattern)
end
get all_but("/index") do
# ...
end
上面的例子可能太繁琐了,因为它也可以用更简单的方式表述:
get // do
pass if request.path_info == "/index"
# ...
end
或者,使用反向查找模式:
get %r{^(?!/index$)} do
# ...
end