Как вы определяете, соответствует ли request.referrer пути восстановления Rails?
Как мы знаем из этого сообщения, в Rails вы можете получить предыдущий url, позвонив
request.referrer
Но как вы проверяете, соответствует ли предыдущий URL одному из спокойных путей в
ваше приложение Rails?
По спокойным путям я имею в виду пути, предоставляемые Rails, такие как
books_path
book_path(book)
edit_book_path(book)
Конечно, я могу выполнить регулярное выражение string на request.referrer, но я думаю, что это немного уродливо.
Один конкретный случай, в моем приложении, заключается в том, что request.referrer может быть
"Локальный: 3000/книги страница = 4"
и я хочу, чтобы он соответствовал
books_path
который возвращает "/books"
В этом случае, как я могу проверить, есть ли совпадение без строки регулярного выражения
совпадение? (если это вообще возможно)
Спасибо
P.S. Я пробовал соответствие строки регулярного выражения, и он работает. Я просто подумал, что в Rails может быть лучший способ.
Ответы
Ответ 1
Вы можете извлечь часть пути request.referer
, используя следующее:
URI(request.referer).path
Затем вы можете использовать Rails.application.routes.recognize_path
, чтобы проверить, сопоставляется ли путь к контроллеру и действию, например:
my_path = URI(request.referer).path
# => /books
Rails.application.routes.recognize_path(my_path)
# => {:action=>"show", :controller=>"books", :page=>"4"}
Ответ 2
Хотя вы не уверены в том, что вы хотите с этим сделать, довольно надежные рельсы поддерживают лучшие способы управления перенаправлением. Тем не менее, я думаю, это то, что вы ищете:
request.referer == books_url(page: params[:page])
ОБНОВЛЕНО:
Таким образом, даже если нет параметров [: page]. Это будет работать нормально.
Ответ 3
Так как recognize_path
устарел, это другой способ сделать это:
Назовите свой маршрут в конфигурации маршрутов, используя ключевое слово as
:
get 'foo/bar' => 'foo#bar', as: :foo_bar
Затем вы можете сделать проверку следующим образом:
if URI(request.referer).path == foo_bar_path
do_something()
end