【发布时间】:2012-02-27 02:39:17
【问题描述】:
我想定义一个全局前置过滤器,它将在每个请求之前运行,它会为所有方法设置一些实例变量。
我已经设置了过滤器,并且还在过滤器之前设置了一些特定的路线。看来我的路由特定过滤器在我的全局过滤器之前执行,因此由于尚未设置预期的实例变量而崩溃。
有没有办法指定前置过滤器的处理顺序?
【问题讨论】:
-
你能贴一些代码吗?你拥有它们的顺序是什么?
我想定义一个全局前置过滤器,它将在每个请求之前运行,它会为所有方法设置一些实例变量。
我已经设置了过滤器,并且还在过滤器之前设置了一些特定的路线。看来我的路由特定过滤器在我的全局过滤器之前执行,因此由于尚未设置预期的实例变量而崩溃。
有没有办法指定前置过滤器的处理顺序?
【问题讨论】:
这对我有用,在 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"]
【讨论】: