Как вы определяете, соответствует ли 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