基於 Regexp 的路徑匹配
匹配路徑的路徑時,你可以顯式地執行此操作,僅匹配一個路徑,如下所示:
get "/hello" do
return "Hello!"
end
你還可以使用正規表示式來匹配複雜路徑。與正規表示式匹配的任何路由都將執行該程式碼塊。如果多個路由可能與請求匹配,則執行第一個匹配的路由。
以下是匹配路徑的典型示例,其中包含/user/
後跟一個或多個數字(可能是使用者 ID),即 GET /user/1
:
get /\/user\/\d+/ do
"Hello, user!"
end
上面的示例匹配/user/1
,但也匹配/delete/user/1
和/user/1/delete/now
,因為我們的正規表示式不是非常嚴格,並且允許與路徑的任何部分進行部分匹配。
我們可以更加明確地使用正規表示式並告訴它與路線完全匹配,使用\A
和\z
指令將匹配錨定到路徑的開頭和結尾:
get /\A\/user\/\d+\z/ do
"Hello, user!"
end
由於匹配錨定,此路線將不匹配/delete/user/1
或/user/1/delete/now
。
忽略尾隨/
我們上面的示例路由也不匹配/user/1/
(尾隨正斜槓)。如果要忽略路徑末尾的尾部斜槓,請調整正規表示式以使斜槓可選( 請注意末尾的\/?
):
get /\A\/user\/\d+\/?\z/ do
"Hello, user! You may have navigated to /user/<ID> or /user/<ID>/ to get here."
end
捕獲路線匹配
到目前為止,我們已經匹配了 regexp 路由,但是如果我們想在程式碼塊中使用匹配的值呢?按照我們的示例,我們如何知道執行路由時使用者的 ID 是什麼?
我們可以捕獲路徑的所需部分,並使用 Sinatra 的 param[:captures]
變數來處理路徑中的資料:
get /\A\/user\/(\d+)\/?\z/ do
"Hello, user! Your ID is #{params['captures'].first}!"
end