当referrer不可用时,请正确地做redirect_to:回到Ruby on Rails

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

我经常得到例外

(ActionController :: RedirectBackError)“在这个动作的请求中没有设置HTTP_REFERER,所以redirect_to:back不能成功调用,如果这是一个testing,请确保指定request.env [\”HTTP_REFERER \“]。

我意识到这是一个引用不可用的结果。 有没有一种方法,例如,可以在访问最后一个页面的每个访问时设置一个会话variables,而当HTTP_REFERER不可用时,利用这个会话variablesredirect到?

你不太可能有一个会议, 并没有一个引用。

引用者没有设置的情况并不罕见,我通常会拯救这种期待:

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

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

顺便说一句,我认为这是一个坏主意,因为这使得用户stream不明确。 只有在login的情况下,这是明智的。

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

 def some_method redirect_back fallback_location: root_path end 

这是我的小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到别的地方。

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

核心function

redirect_back是Rails 5+的一个核心特性,它已经包含在ApplicationController::Base中的ActionController::Redirecting模块中。

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

编辑: 来源

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

  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的答案,将其添加到您的应用程序控制器

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

最近,我遇到了同样的问题,无论是我必须redirect:back或特定页面。 去了很多解决scheme后,我终于发现这个很简单,似乎解决了这个问题:

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

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