实际上,您可以after_sign_in_path_for
像这样简单地在控制器中定义方法:
class ApplicationController < ActionController::Base
def after_sign_in_path_for
params[:target] || some_default_url
end
end
然后,如果您的不同登录表单具有不同的目标,则应正确重定向用户
添加
<input type="hidden" name="target" value="/dashboard"/>
对于将重定向到特定页面的每个特定表单就足够了:)
编辑:我想我终于明白了你到底想要什么。所以在这里我会做什么(基于这篇博文)
class ApplicationController < ActionController::Base
protect_from_forgery
def after_sign_in_path_for(user)
origin_path = session[:origin_path]
clear_origin_path
if origin_path.present?
origin_path
else
params[:target].presence || default_redirect_path
end
end
private
def authenticate_user!
store_origin_path
super
end
def store_origin_path
session[:origin_path] = request.fullpath
end
def clear_origin_path
session[:origin_path] = nil
end
end
所以基本上,如果您尝试访问受保护的路径(比如说/protected_resource
),该路径将存储在会话中,然后一旦用户登录,会话将被清除并正确重定向用户
然后,如果用户使用您的不同sign_in
表单之一并且该表单包含target
输入,则用户将被重定向到该目标。
最后,如果用户在没有任何目标的情况下进入表单,他将被重定向到default_redirect_path
您可能想要自定义的表单。
最后一件事:我假设重定向到原始请求比目标更重要,所以假设用户继续/protected_resource
并因此被重定向到 sign_in 表单,即使此 sign_in 表单有target
输入,用户也会被重定向/protected_resource
到成功登录。
您可以通过反转after_sign_in_path_for
方法中的条件轻松更改它
可能有更好的方法来做到这一点,但这对你来说是一个起点,你可能想要改进它;)
如果我的回答不够详细,请告诉我。