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,以防他访问:

  1. 示例。com/posts/1 或
  2. 示例。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

使用此代码:

  1. 示例。com/posts/1 - 失败
  2. 示例。com/posts/1/ - 确定

我可以同时满足这两个条件吗?

您可以将正斜杠后跟第二个捕获组包装在一个可选的非捕获组中:

posts\/([0-9]+)(?:\/(.*))?

说明

  • posts\/ 匹配 posts/
  • ([0-9]+)捕获第1组,匹配1+个数字
  • (?:非捕获组
    • \/(.*) 匹配 / 并在组 2 中捕获 0+ 次除换行符外的任何字符
  • )? 关闭非捕获组并使其可选

Regex demo