我想定义一个全局的过滤器,它将在每个为所有方法设置一些实例变量的请求之前运行。
我已经设置了过滤器,并且还在过滤器之前设置了一些特定的路由。看来我的路由特定过滤器正在我的全局过滤器之前执行,因此崩溃,因为预期的实例变量尚未设置。
有没有办法指定处理过滤器之前的顺序?
答案 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"]