Sinatra:在过滤器订购之前

时间:2012-02-27 02:39:17

标签: ruby sinatra

我想定义一个全局的过滤器,它将在每个为所有方法设置一些实例变量的请求之前运行。

我已经设置了过滤器,并且还在过滤器之前设置了一些特定的路由。看来我的路由特定过滤器正在我的全局过滤器之前执行,因此崩溃,因为预期的实例变量尚未设置。

有没有办法指定处理过滤器之前的顺序?

1 个答案:

答案 0 :(得分:2)

这适用于Sinatra 1.3.2。

before do
  @filter = [] << 'everything'
end
before '/filter' do
  @filter << 'specific'
end
get '/filter' do
  @filter.inspect
end

这给了我["everything", "specific"]这就是我所期望的。是否有可能在所有其他过程之前没有全能过滤器?

在Sinatra中,路线按照从顶部开始的顺序进行评估,而不是根据它们的匹配程度进行评估。因此,如果在catch-all过滤器之前有特定的过滤器,它将首先评估这些过滤器,如下所示:

before '/filter' do
  @filter = [] << 'specific'
end
before do
  @filter << 'everything'
end
get '/filter' do
  @filter.inspect
end    # => ["specific", "everything"]