Регулярное выражение URI маршрутов Ruby

У меня есть веб-приложение для блога на Roda, где ссылки имеют следующий формат URL:example.com/posts/<id>/<slug>.

Например example.com/posts/1/example-blog-post.

Я хочу перенаправить пользователя на example.com/posts/1/example-blog-post в случае посещения:

  1. example.com/posts/1 или
  2. example.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. example.com/posts/1 - НЕУДАЧИ
  2. example.com/posts/1/ - ОК

Могу ли я удовлетворить оба условия?

1 ответ

Решение

Вы можете заключить косую черту, за которой следует вторая группа захвата, в необязательной группе без захвата:

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

Объяснение

  • posts\/ Соответствие posts/
  • ([0-9]+) Группа захвата 1, совпадение 1+ цифр
  • (?: Группа без захвата
    • \/(.*) Соответствие / и захватить в группе 2 0+ раз любой символ, кроме новой строки
  • )? Закройте группу без захвата и сделайте ее необязательной

Демо Regex

Другие вопросы по тегам