基於 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