直接访问页面时忽略先前URL的URI(request.referer).path

我正在尝试在会话中保存以前的URL,我目前有这个代码:

after_filter "save_my_previous_url", only: [:renderForm, :renderQuote] def save_my_previous_url if URI(request.referer).path session[:my_previouse_url] = URI(request.referer).path else session[:my_previouse_url] = URI(request.referer).path end end 

当你从一个页面,到一个表单,然后到感谢页面,它工作,但如果你直接直接访问一个表单而不是单击一个链接,我会收到此错误:

 bad argument (expected URI object or URI string) 

所以我需要一些如果没有以前的url时忽略这一点。

好吧,在处理null或空对象/变量时,我会分享一些我总是使用ruby / rails的技巧。

 def save_my_previous_url if request.referer.present? session[:my_previouse_url] = URI( (request.referer || "") ).path else session[:my_previouse_url] = URI( (request.referer || "") ).path end end 

说明:这里的技术是假设在最坏的情况下,我们从方法调用request.referer返回nil。 因此,每当您将null值传递给函数并知道下一个方法调用将会爆炸时,请将此代码段作为参数传递:

 ( @variable || "whatever_value_needed" ) #alternatively: ( method_call || "whatever_value_needed" ) 

在这种情况下,“whatever_value_needed”应该是一个空字符串。

这种技术有效,因为request.referer方法调用首先被计算为nil,更具体地说是布尔值false。 然后,由于’或’|| 运算符,第二个操作数被评估,在这种情况下是“”。 然后,URI对象实例化将顺利运行,因为它接受一个空字符串作为参数,并且对此新对象的所有方法调用都将起作用(…不会抛出exception)。

无论遇到什么问题,都可以随意使用这种技术。 如果这对你有帮助,请upvote!

您需要确保您处理nil referrer和referrer的URL无法解析(例如,像http://x.com?utm_term=a|b – “|”这样的url导致解析失败,至少在某些版本的摩擦)。

这段代码(或类似的东西)适合我:

 begin if request.referer.present? && URI.parse(request.referer).path session[:my_previouse_url] = URI(request.referer).path else session[:my_previouse_url]=nil; end rescue URI::Error => e session[:my_previouse_url]=nil; end