我想定义一个全局前置过滤器,它将在每个请求之前运行,为所有方法设置一些实例变量。
我已经设置了过滤器,还在过滤器之前设置了一些特定的路由。似乎我的路由特定过滤器在我的全局过滤器之前执行,因此崩溃,因为尚未设置预期的实例变量。
有没有办法指定处理 before 过滤器的顺序?
最佳答案
这对我有用,适用于 Sinatra 1.3.2。
before do
@filter = [] << 'everything'
end
before '/filter' do
@filter << 'specific'
end
get '/filter' do
@filter.inspect
end
这给了我 ["everything", "specific"]
这正是我所期望的。有没有可能你没有先于所有其他过滤器的 catch-all 过滤器?
在 Sinatra 中,路由是按从上到下的顺序进行评估的,而不是根据它们的匹配程度。因此,如果您在 catch-all 过滤器之前有特定过滤器,它将首先评估这些过滤器,如下所示:
before '/filter' do
@filter = [] << 'specific'
end
before do
@filter << 'everything'
end
get '/filter' do
@filter.inspect
end # => ["specific", "everything"]
关于ruby - Sinatra:过滤器排序之前,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9459397/