3

我正在尝试将以前的 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 时忽略它。

4

2 回答 2

0

好吧,我将分享一个我在处理空或空对象/变量时总是使用 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。因此,每当您将空值传递给函数并知道下一个方法调用将失败时,请将此代码段作为参数传递:

( @variable || "whatever_value_needed" )

#alternatively:
( method_call || "whatever_value_needed" )

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

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

无论您遇到此问题,请随意使用此技术。如果这对你有帮助,请点赞!

于 2013-10-09T01:53:41.323 回答
0

您需要确保处理 nil 引用者和 URL 无法解析的引用者(例如http://x.com?utm_term=a|b之类的 url ——“|” 导致解析失败,至少在一些版本的 rub)。

这段代码(或类似的代码)对我有用:

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
于 2015-11-12T15:51:17.257 回答