当referrer不可用时,正确地执行redirect_to:返回Ruby on Rails

时间:2009-04-21 08:42:41

标签: ruby-on-rails ruby http

我遇到redirect_to :back的问题。是的,它是推荐人。

我经常得到例外

  

(ActionController :: RedirectBackError)“在此操作的请求中未设置HTTP_REFERER,因此无法成功调用redirect_to:back。如果这是测试,请确保指定request.env [\”HTTP_REFERER \“ ]“。

我意识到这是推荐人无法使用的结果。有没有办法,例如,可以在访问的最后一页访问每次访问时设置一个会话变量,当HTTP_REFERER不可用时,利用此会话变量重定向到?

8 个答案:

答案 0 :(得分:140)

没有设置推荐人的情况并不罕见,我通常会拯救这种期望:

def some_method
  redirect_to :back
rescue ActionController::RedirectBackError
  redirect_to root_path
end

如果你经常这样做(我认为这是一个坏主意)你可以用Maran建议的其他方法包装它。

BTW我认为这是一个坏主意,因为这会使用户流模糊不清。只有在登录的情况下这才是明智的。

更新:有几个人用Rails 5指出了这个no longer works。 相反,使用redirect_back,此方法也支持回退。然后代码变为:

def some_method
  redirect_back fallback_location: root_path
end

答案 1 :(得分:38)

这是我的小redirect_to_back方法:

  def redirect_to_back(default = root_url)
    if request.env["HTTP_REFERER"].present? and request.env["HTTP_REFERER"] != request.env["REQUEST_URI"]
      redirect_to :back
    else
      redirect_to default
    end
  end

如果http_refferrer为空,您可以传递一个可选的url去其他地方。

答案 2 :(得分:37)

def store_location
  session[:return_to] = request.request_uri
end

def redirect_back_or_default(default)
  redirect_to(session[:return_to] || default)
  session[:return_to] = nil
end

试试吧! (感谢Authlogic插件)

答案 3 :(得分:28)

核心功能

redirect_back是Rails 5+的核心功能,可以在ActionController::Redirecting已包含的ApplicationController::Base模块中使用。

  

弃用警告:redirect_to :back已弃用,将从Rails 5.1中删除。请使用redirect_back(fallback_location: fallback_location),其中fallback_location表示如果请求没有HTTP引用信息,则使用的位置。

编辑:source

答案 4 :(得分:21)

也许现在已经晚了,但我想分享我的方法,这也保留了选项:

  def redirect_back_or_default(default = root_path, *options)
    tag_options = {}
    options.first.each { |k,v| tag_options[k] = v } unless options.empty?
    redirect_to (request.referer.present? ? :back : default), tag_options
  end

您可以像以下一样使用它:

redirect_back_or_default(some_path, :notice => 'Hello from redirect', :status => 301)

答案 5 :(得分:13)

类似于@ troex的答案,将其添加到您的应用程序控制器

def redirect_back_or_default(default = root_path, options = {})
  redirect_to (request.referer.present? ? :back : default), options
end

然后在您的控制器中使用它

redirect_back_or_default answer_path(answer), flash: { error: I18n.t('m.errors')}

答案 6 :(得分:0)

最近,我遇到了同样的问题,我必须重定向:back或特定页面。经过大量的解决方案,我终于发现这很简单,似乎解决了这个问题:


if request.env["HTTP_REFERER"].present?
    redirect_to :back
else
    redirect_to 'specific/page'
end

如果您想使用session详细信息,请在代码的else部分执行此操作。

答案 7 :(得分:0)

redirect_back_or_to(Rails 7+)

Rails 7 提供了一种新的惯用方式来重定向回或回退位置。

直接引用官方 Rails API 文档:

redirect_back_or_to(fallback_location, allow_other_host: true, **args)
<块引用>

如果可能,将浏览器重定向到发出请求的页面(引用者),否则重定向到提供的默认回退位置。

<块引用>

referrer 信息是从请求的 HTTP Referer (sic) 标头中提取的。这是一个可选的标头,它在请求中的存在取决于浏览器安全设置和用户首选项。如果请求缺少此标头,则将使用 fallback_location。

redirect_back_or_to({ action: "show", id: 5 })
redirect_back_or_to @post
redirect_back_or_to "http://www.rubyonrails.org"
redirect_back_or_to "/images/screenshot.jpg"
redirect_back_or_to posts_url
redirect_back_or_to proc { edit_post_url(@post) }
redirect_back_or_to '/', allow_other_host: false

还值得一提的是
Rails 5 方式redirect_back(fallback_location: '/things/stuff')
与新引入的 redirect_back_or_to('/things/stuff') 具有完全相同的行为。

来源: