2014-04-14 54 views
0

有沒有辦法使用問號來匹配url和Sinatra?Sinatra URL與問號?

get '/:id?inspect' do 
    # ... 
end 

get '/:id?last' do 
    # ... 
end 

get '/:id' do 
    # ... 
end 

我試圖逃避問號\?,正則表達式等,但這些都不奏效。

我不想檢索inspectlast的值。我只想知道它們是否在url中提供。

這可能嗎?

+1

我不太明白 - 你問的問題和http://stackoverflow.com/q/15774187/214790一樣嗎? – matt

+0

問題幾乎相同,但上述鏈接中的正確答案僅解釋了URL路由的工作方式,但並未回答問題。我想知道它是否可行,以及如何。我知道問號是一個URL分隔符,我試圖逃避它,但沒有奏效。 –

+0

所以你想基於查詢字符串的內容進行路由?像在'if'語句中檢查'request.query_string',但使用單獨的路由? – matt

回答

0

你不能直接做你想做的。在描述路線時,Sinatra將?定義爲一個可選參數,並沒有提供逃避它的方法。

在URL中,?從查詢字符串中分離出路徑,而Sinatra在匹配路由時僅使用該路徑。查詢字符串的內容被解析並在params中可用,並且原始字符串可用作爲request.query_string

您的網址方案顯得相當不尋常,但一個可能性,如果你想避免在實際的路線檢查query_string可以創建一個custom condition申請到航線,並在那裏檢查:

set(:query) { |val| condition { request.query_string == val } } 

get '/:id', :query => 'inspect' do 
    # ... 
end 

get '/:id', :query => 'last' do 
    # ... 
end 

get '/:id' do 
    # ... 
end 
0

標準路由不是由查詢參數定義的,也不應該是。爲什麼不使用get /:id路由中params上的if結構?

我也建議,當你想在請求中設置的查詢參數設置這樣的:/:id?inspect=true(提供虛假值)

+0

爲什麼不呢?我寧願有一個特定的方法(塊)處理參數,而不是全局方法中的明確的「if」。 '?last'和'?inspect'不是資源,它們不需要具有特定的URL,它們只是用於相同資源URL的選項,但由於它們在我的用例中有不同的表示形式,所以我會而是要有特定的方法(塊),並讓Sinatra處理基於url的條件。 –