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

时间:2013-06-17 13:20:05

标签: ruby-on-rails url controller uri before-filter

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

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)

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

2 个答案:

答案 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