ruby-on-rails 当直接访问一个页面时,忽略上一个URL的URI(request.referer).path

eivgtgni  于 2023-05-30  发布在  Ruby
关注(0)|答案(2)|浏览(135)

我正在尝试在会话中保存以前的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)

因此,我需要一些如何忽略这一点时,没有以前的网址。

omhiaaxx

omhiaaxx1#

你需要确保你同时处理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
vcirk6k6

vcirk6k62#

好吧,我将分享一个我在ruby/rails中处理null或空对象/变量时经常使用的小技巧。

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对象示例化顺利运行,因为它接受一个空字符串作为参数,并且对这个新对象的所有方法调用都将工作(...不会抛出异常)。

相关问题