我遇到redirect_to :back
的问题。是的,它是推荐人。
我经常得到例外
(ActionController :: RedirectBackError)“在此操作的请求中未设置HTTP_REFERER,因此无法成功调用redirect_to:back。如果这是测试,请确保指定request.env [\”HTTP_REFERER \“ ]“。
我意识到这是推荐人无法使用的结果。有没有办法,例如,可以在访问的最后一页访问每次访问时设置一个会话变量,当HTTP_REFERER不可用时,利用此会话变量重定向到?
答案 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)
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')
具有完全相同的行为。
来源:
redirect_back_or_to
official docs。redirect_back
official docs。