13

正如我们从这篇文章中知道的那样,在 Rails 中,您可以通过调用

request.referrer

但是如何检查之前的 url 是否与 Rails 应用程序中的一个 restful 路径匹配?

我所说的宁静路径是指 Rails 提供的路径,例如,

books_path
book_path(book)
edit_book_path(book)

当然可以对request.referrer做正则表达式字符串匹配,但是我觉得有点难看。

在我的应用程序中,一个特殊情况是 request.referrer 可以是“localhost:3000/books?page=4”

我想让它匹配

books_path

返回“/books”

在这种情况下,如何在不进行正则表达式字符串匹配的情况下检查是否存在匹配?(如果这是可能的话)

谢谢

PS我试过正则表达式字符串匹配,它有效。我只是认为在 Rails 中可能有更好的方法。

4

3 回答 3

18

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"}
于 2013-08-29T17:18:28.120 回答
3

虽然不确定你想用它做什么,但可以肯定的是 rails 支持更好的控制重定向的方法。不过,我想这就是你要找的东西:

request.referer == books_url(page: params[:page])

更新:

这样,即使没有 params[:page]。这仍然可以正常工作。

于 2013-08-29T17:08:44.057 回答
1

由于recognize_path已弃用,这是另一种方法:

as使用关键字在您的路线配置中命名您的路线:

get 'foo/bar' => 'foo#bar', as: :foo_bar

然后你可以像这样进行检查:

if URI(request.referer).path == foo_bar_path
  do_something()
end
于 2017-09-06T18:22:46.077 回答