如果您的登录表单有自己的页面,而不是例如每个页面标题中的登录表单,这里的一些其他解决方案可能不起作用。登录后,用户需要返回两页,而不仅仅是一页。
Devise 有一个很好的 How To on Redirecting back to the current page after sign in, sign out, update,下面的代码来自于它。
将原始 URL 存储在会话中是最佳选择。除了解决上述返回两页的问题外,“许多浏览器不发送 [the request.referer
] 标头。因此,实现此功能的唯一可靠的跨浏览器方法是使用会话。”
在会话中存储 URL 时,重要的是不要存储任何 POST、PUT 或 DELETE 请求的 URL,也不要存储任何 XHR 请求,即用户实际上无法重定向到的任何内容。
请注意,退出后,用户的会话被破坏,因此存储的 URL 消失了。在这种情况下,用户可以被送回request.referer
。这似乎是可以接受的,因为大多数网站在每个页面上都有一个退出链接,因此返回引荐来源网址实际上会起作用。
class ApplicationController < ActionController::Base
before_action :store_user_location!, if: :storable_location?
before_action :authenticate_user!
private
def storable_location?
request.get? && is_navigational_format? && !devise_controller? && !request.xhr?
end
def store_user_location!
store_location_for(:user, request.fullpath)
end
def after_sign_in_path_for(resource_or_scope)
stored_location_for(resource_or_scope) || super
end
def after_sign_out_path_for(resource_or_scope)
request.referrer || super
end
end