有沒有辦法使用問號來匹配url和Sinatra?Sinatra URL與問號?
get '/:id?inspect' do
# ...
end
get '/:id?last' do
# ...
end
get '/:id' do
# ...
end
我試圖逃避問號\?
,正則表達式等,但這些都不奏效。
我不想檢索inspect
或last
的值。我只想知道它們是否在url中提供。
這可能嗎?
有沒有辦法使用問號來匹配url和Sinatra?Sinatra URL與問號?
get '/:id?inspect' do
# ...
end
get '/:id?last' do
# ...
end
get '/:id' do
# ...
end
我試圖逃避問號\?
,正則表達式等,但這些都不奏效。
我不想檢索inspect
或last
的值。我只想知道它們是否在url中提供。
這可能嗎?
你不能直接做你想做的。在描述路線時,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
標準路由不是由查詢參數定義的,也不應該是。爲什麼不使用get /:id
路由中params
上的if
結構?
我也建議,當你想在請求中設置的查詢參數設置這樣的:/:id?inspect=true
(提供虛假值)
爲什麼不呢?我寧願有一個特定的方法(塊)處理參數,而不是全局方法中的明確的「if」。 '?last'和'?inspect'不是資源,它們不需要具有特定的URL,它們只是用於相同資源URL的選項,但由於它們在我的用例中有不同的表示形式,所以我會而是要有特定的方法(塊),並讓Sinatra處理基於url的條件。 –
我不太明白 - 你問的問題和http://stackoverflow.com/q/15774187/214790一樣嗎? – matt
問題幾乎相同,但上述鏈接中的正確答案僅解釋了URL路由的工作方式,但並未回答問題。我想知道它是否可行,以及如何。我知道問號是一個URL分隔符,我試圖逃避它,但沒有奏效。 –
所以你想基於查詢字符串的內容進行路由?像在'if'語句中檢查'request.query_string',但使用單獨的路由? – matt