Ruby on rails 忽略URI(request.referer)。直接访问页面时上一个URL的路径

Ruby on rails 忽略URI(request.referer)。直接访问页面时上一个URL的路径,ruby-on-rails,url,controller,uri,before-filter,Ruby On Rails,Url,Controller,Uri,Before Filter,我试图在会话中保存上一个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]

我试图在会话中保存上一个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
说明: 这里的技术是假设在更糟糕的情况下,我们从方法call request.referer返回nil。因此,当您将空值传递到函数中并且知道下一个方法调用将中断时,请将此代码段作为参数传递:

( @variable || "whatever_value_needed" )

#alternatively:
( method_call || "whatever_value_needed" )
在本例中,“所需的任意值”应为空字符串

这种技术之所以有效,是因为request.referer方法调用首先被计算为nil,更确切地说是一个布尔值false。然后,由于使用了“or”| |运算符,对第二个操作数求值,在本例中为“”。URI对象实例化然后平稳运行,因为它接受一个空字符串作为参数,并且对这个新对象的所有方法调用都将工作(…不会引发异常)


无论您在何处遇到此问题,都可以随意使用此技术。如果这对你有帮助,请投票

您需要确保同时处理nil referer和referer的who-url无法解析(例如,像--“|”这样的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

当referer为nil或无效时,URI(request.referer)将抛出一个错误。看下面我的答案。你读了我的答案吗?在这里使用
begin
完全是矫枉过正。这一点都不优雅。@Mike.MKrallaProduction我发现推荐人可能包含无效的URI(例如)。这将为代码
URI(request.referer | | |“”).path中的行引发异常。我很乐意找到一个更优雅的解决方案。我刚刚在我的rails控制台中用
x.com?utm_term=a | b
运行了您的示例,我没有遇到异常<代码>[4]pry(main)>URI('x.com?utm_term=a | b')。路径
=>“x.com”
。它不会抛出错误,但URI算法假设由于没有协议,路径以
x.com
开头,这是它应该假设的。你能提供一个失败的例子吗?我一定会进行测试。很有趣,所以当我执行您的示例时(如我之前所说),不会抛出错误,所以我将假设它与版本差异有关。我唯一一次遇到这个错误是如果我真的使用了一个格式错误的URI(例如:一个空格字符)。但是,我想指出原始帖子中包含的实际错误,我的答案确实正确地解决了
错误参数(预期的URI对象或URI字符串)。
继续并将
nil
传递给
URI
,您将得到他得到的错误,我的答案就是针对这一点的。