你如何确定request.referrer是否匹配Rails的restful路径?

时间:2013-08-29 16:42:01

标签: ruby-on-rails

正如我们从this post了解到的,在Rails中,您可以通过调用

获取上一个网址
request.referrer

但是如何检查前一个网址是否与其中一个其余路径匹配 你的Rails应用程序?

通过restful路径,我指的是Rails提供的路径,例如

books_path
book_path(book)
edit_book_path(book)

当然我可以在request.referrer上进行正则表达式字符串匹配,但我觉得它有点难看。

在我的应用程序中,一个特殊情况是request.referrer可以 “本地主机:3000 /书页= 4”

我希望它匹配

books_path

返回“/ books”

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

由于

P.S。我已经尝试了正则表达式字符串匹配,它的工作原理。我只是觉得在Rails中可能有更好的方法。

3 个答案:

答案 0 :(得分:16)

您可以使用以下内容提取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"}

答案 1 :(得分:3)

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

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

<强>更新:

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

答案 2 :(得分:0)

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

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

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

然后你可以像这样做检查:

if URI(request.referer).path == foo_bar_path
  do_something()
end