Ruby маршруты URI регулярное выражение - PullRequest
0 голосов
/ 26 марта 2020

У меня есть веб-приложение для блога на 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 / (обратите внимание на последний backsla) sh)

Вот что я получил в маршрутах:

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 - FAILS
  2. example.com / posts / 1 / - OK

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

1 Ответ

1 голос
/ 26 марта 2020

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

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

Пояснение

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

Regex demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...