2012-02-27 102 views
3

我想定義一個全局的過濾器,它將在每個請求之前運行,這將爲所有方法設置一些實例變量。Sinatra:在過濾器訂購之前

我已經設置了過濾器,並在過濾器之前設置了一些特定的路由。看起來,我的路由特定的過濾器正在我的全局之前執行,因此崩潰,因爲預期的實例變量尚未設置。

有沒有辦法指定處理過濾器之前的順序?

+0

您可以發佈一些代碼嗎?你以什麼樣的順序擁有所有這些? – 2012-02-27 03:28:29

回答

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中,路線的評估順序是從頂部開始,而不是按照他們的匹配程度。因此,如果您在捕獲全部過濾器之前具有特定過濾器,則會首先評估這些過濾器,如下所示:

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

就是這樣。謝謝! – jasonlfunk 2012-02-27 14:34:52