在Sinatra README中,有一个名为Custom Route Matchers的部分,其中包含以下示例:
class AllButPattern
Match = Struct.new(: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
有没有人有足够的帮助来告诉我这是如何工作的?我不确定的是为什么该示例具有Match
结构和captures
是什么。用户无法设置@captures
实例变量,只能设置@except
个变量;那么如何使用captures
?
答案 0 :(得分:3)
When a route is processed, it takes the argument to get
(or post
or whatever), and sends to that object's match
method with the path as an argument。它期望返回nil
这意味着它不匹配,或者一系列捕获。该对象通常是字符串或正则表达式,它们都有match
方法。
Sinatra also calls on the captures
method of the object when it is processing a route。该示例使用结构作为一种简单的方法来设置和响应一个对象,该对象本身将响应captures
,并放入一个数组,因为这通常会返回captures
。它是空的,因为没有检查字符串的捕获,它实际上是一个负过滤器。因此,我更喜欢the use of a before
filter做这样的事情,但找到明确有用的例子总是很困难。