正如我们从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中可能有更好的方法。
答案 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