Sinatra示例中的这个自定义路由匹配器如何工作?

时间:2013-08-13 11:38:40

标签: ruby routes sinatra

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

1 个答案:

答案 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做这样的事情,但找到明确有用的例子总是很困难。