当引荐来源不可用时,在Ruby on Rails中正确执行redirect_to:back


91

我有一个问题redirect_to :back。是的,它是引荐来源。

我经常得到例外

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

我意识到这是引荐来源不可用的结果。例如,是否有一种方法可以在每次访问时访问的上一个访问页面上设置一个会话变量,并且在HTTP_REFERER不可用时,利用此会话变量重定向到?


我在更新操作中有相同的错误,这很奇怪,因为引荐来源不能为空(因为请求来自表单),但是某些用户设法做到了这一点,但我不知道如何做。
lulalala 2012年

Answers:


144

这是不可能的,你这样做有一个会议,并没有有引用。

未设置引荐来源网址的情况并不少见,我通常会挽救这种期望:

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

如果您经常执行此操作(我认为这是个坏主意),则可以将其包装为Maran建议的其他方法。

顺便说一句,我认为这是一个坏主意,因为这会使用户流变得模棱两可。仅在登录的情况下才有意义。

更新:正如一些人指出的那样,它不再适用于Rails5。相反,使用redirect_back,此方法还支持备用。然后,代码变为:

def some_method
  redirect_back fallback_location: root_path
end

4
我怀疑我会将其更改为改为使用rescue_from。
鲍勃·阿曼

1
rescue_from如果控制器有多个,我们可以使用@BobAman IMOredirect_to :back
Theo B

不适用于rails 5,ActionController :: RedirectBackError未定义...什么解决方案?
矩阵

改用它:redirect_to (request.referrer || root_url)
Abhi

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到其他地方。


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插件)


22
这是一个很好的解决方案,但是我敦促使用它的任何人记住,如果他或她使用多个选项卡浏览您的应用程序,那么它可能以“破坏”的方式使用户极度困惑。
米奇·林格伦

3
+1用于回答问题而不批评设计方法。
安倍·佩特里罗

31

核心功能

redirect_back是Rails 5+的核心功能ActionController::Redirecting,已经在中包含的模块中提供ApplicationController::Base

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

编辑:


请链接至源代码
克里斯·布鲁姆

1
@ Chrisbloom7这是我在通过运行Rails 5.0.0beta3时收到的警告消息redirect_to :back
西里尔·杜尚·多丽丝

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)

14

更新:Rails 5添加了redirect_back方法(https://github.com/rails/rails/pull/22506/),最好只使用:

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

对于低于5.0的导轨,仍然可以使用以下旧方法:

与@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')}

0

最近,我遇到了相同的问题,我不得不重定向:back到特定页面。经过大量解决方案后,我终于找到了一个简单的方法,似乎可以解决问题:


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

如果要使用session详细信息,请在代码的其他部分进行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.