Регулярное выражение URI маршрутов Ruby
У меня есть веб-приложение для блога на Roda, где ссылки имеют следующий формат URL:example.com/posts/<id>/<slug>
.
Например example.com/posts/1/example-blog-post
.
Я хочу перенаправить пользователя на example.com/posts/1/example-blog-post
в случае посещения:
- example.com/posts/1 или
- 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
С этим кодом:
- example.com/posts/1 - НЕУДАЧИ
- example.com/posts/1/ - ОК
Могу ли я удовлетворить оба условия?
1 ответ
Решение
Вы можете заключить косую черту, за которой следует вторая группа захвата, в необязательной группе без захвата:
posts\/([0-9]+)(?:\/(.*))?
Объяснение
posts\/
Соответствиеposts/
([0-9]+)
Группа захвата 1, совпадение 1+ цифр(?:
Группа без захвата\/(.*)
Соответствие/
и захватить в группе 2 0+ раз любой символ, кроме новой строки
)?
Закройте группу без захвата и сделайте ее необязательной