我正在尝试在会话中保存以前的网址,我目前有这段代码:
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)
所以我需要一些如果没有以前的网址时忽略这一点。
答案 0 :(得分:0)
好吧,在处理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对象实例化将顺利运行,因为它接受一个空字符串作为参数,并且对这个新对象的所有方法调用都将起作用(...不会抛出异常)。
无论何时遇到此问题,都可以随意使用此技术。如果这有助于你,请upvote!
答案 1 :(得分:0)
你需要确保你处理nil referrer和referrer的URL无法解析(例如 http://x.com?utm_term=a|b 这样的网址 - “|”导致解析失败,在至少在某些版本的摩擦中。)
这段代码(或类似代码)适合我:
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