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

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

我经常得到例外

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

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

user67050 asked 2019-08-13T09:55:46Z
7个解决方案
140 votes

您不太可能有会话并且没有推荐人。

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

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

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

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

更新:有几个人指出这不再适用于Rails 5。相反,使用redirect_back,此方法也支持回退。 代码然后变成:

def some_method
  redirect_back fallback_location: root_path
end
harm answered 2019-08-13T09:56:29Z
38 votes

这是我的小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以转到其他位置。

Mirko answered 2019-08-13T09:57:01Z
37 votes
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插件)

Maran answered 2019-08-13T09:57:25Z
28 votes

核心功能

redirect_to :back是Rails 5+的核心功能,它可以在redirect_back(fallback_location: fallback_location)模块中获得,该模块已包含在fallback_location中。

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

编辑:来源

Cyril Duchon-Doris answered 2019-08-13T09:58:12Z
21 votes

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

  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)
troex answered 2019-08-13T09:58:39Z
12 votes

类似于@ 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')}
longkt90 answered 2019-08-13T09:59:10Z
0 votes

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


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

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

Rahul Goyal answered 2019-08-13T09:59:43Z
translate from https://stackoverflow.com:/questions/771656/correctly-doing-redirect-to-back-in-ruby-on-rails-when-referrer-is-not-availabl