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

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

我试图在 session 中保存以前的 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

解释: 这里的技术是假设在最坏的情况下,我们从方法调用 request.referer 返回 nil。因此,每当您将 null 值传递给函数并且知道下一个方法调用将失败时,请将此代码段作为参数传递:

( @variable || "whatever_value_needed" )

#alternatively:
( method_call || "whatever_value_needed" )

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

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

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

关于ruby-on-rails - 直接访问页面时忽略上一个 URL 的 URI(request.referer).path,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17148470/

相关文章:

ruby-on-rails - 我正在使用 Rails Castomniauth 并收到此错误

ruby-on-rails - 语法错误,意外的keyword_or范围

ruby-on-rails - form_for指定 ":html => { :multipart => true}"是否正确?

linux - 如何使用 Linux bash 脚本从浏览器(即 Google Chrome)中提取实际打开页面的 URL?

java - Spring 中使用@Valid 的验证表单不起作用

ios - iphone作为开始键

ruby-on-rails - 使用 :limit in to_json Statement?

python - 如何将这些 header 添加到我的 python urllib opener?

swift - 在prepareForSegue中快速使用tableView

javascript - URL 中的多个井号