Ruby 路由 URI 正则表达式
Ruby routes URI regex
我在 Roda 上有博客 Web 应用程序,其中链接具有以下 URL 格式:example.com/posts/<id>/<slug>
.
例如example.com/posts/1/example-blog-post
.
我想要实现的是将用户重定向到 example.com/posts/1/example-blog-post
,以防他访问:
- 示例。com/posts/1 或
- 示例。com/posts/1/(注意最后一个反斜杠)
这就是我到目前为止在路线中得到的:
r.on /posts\/([0-9]+)\/(.*)/ do |id, slug|
@post = Post[id]
if URI::encode(@post[:slug]) == slug
view("blogpage")
else
r.redirect "/posts/#{id}/#{@post[:slug]}"
end
end
使用此代码:
- 示例。com/posts/1 - 失败
- 示例。com/posts/1/ - 确定
我可以同时满足这两个条件吗?
您可以将正斜杠后跟第二个捕获组包装在一个可选的非捕获组中:
posts\/([0-9]+)(?:\/(.*))?
说明
posts\/
匹配 posts/
([0-9]+)
捕获第1组,匹配1+个数字
(?:
非捕获组
\/(.*)
匹配 /
并在组 2 中捕获 0+ 次除换行符外的任何字符
)?
关闭非捕获组并使其可选
我在 Roda 上有博客 Web 应用程序,其中链接具有以下 URL 格式:example.com/posts/<id>/<slug>
.
例如example.com/posts/1/example-blog-post
.
我想要实现的是将用户重定向到 example.com/posts/1/example-blog-post
,以防他访问:
- 示例。com/posts/1 或
- 示例。com/posts/1/(注意最后一个反斜杠)
这就是我到目前为止在路线中得到的:
r.on /posts\/([0-9]+)\/(.*)/ do |id, slug|
@post = Post[id]
if URI::encode(@post[:slug]) == slug
view("blogpage")
else
r.redirect "/posts/#{id}/#{@post[:slug]}"
end
end
使用此代码:
- 示例。com/posts/1 - 失败
- 示例。com/posts/1/ - 确定
我可以同时满足这两个条件吗?
您可以将正斜杠后跟第二个捕获组包装在一个可选的非捕获组中:
posts\/([0-9]+)(?:\/(.*))?
说明
posts\/
匹配posts/
([0-9]+)
捕获第1组,匹配1+个数字(?:
非捕获组\/(.*)
匹配/
并在组 2 中捕获 0+ 次除换行符外的任何字符
)?
关闭非捕获组并使其可选