使用Devise after_sign_in_path_for重定向循环
我有一点菜鸟问题。 我想设计重定向到用户访问的最后一页。 所以我做了以下……
def after_sign_in_path_for(resource) request.referer end
工作得很好…除非用户实际通过原始表单登录导致重定向循环。
我试过了
def after_sign_in_path_for(resource) if (request.referer == "/users/sign_in") :pages_home else request.referer end end
但这不起作用,很可能是因为我不知道request.referer在遇到原始用户登录页面时实际返回了什么(www.example.com/users/sign_in)。
有任何想法吗?
tldr; 使用devise,我想重定向到从(/ blog / 4)登录的页面,除非页面是/ users / sign_in
解决了:
Matchu是对的。 request.referer也返回了域名……
http://example.com/users/sign_in
(注意:没有www前缀)
如果它是一种不安全或低效的方式,我仍然对request.referer的替代方案感兴趣。
不要重定向到推荐人 – 这通常是一个坏主意。
而是在查询字符串或表单数据中传递next
值。 也许使用类似的东西:
def after_sign_in_path_for(resource) params[:next] || super end
当用户尝试访问需要认证的页面(例如, /admin/posts/3/edit
)时,认证before_filter
发出redirect_to new_session_url(:next => request.path)
。 然后编写登录操作和视图的代码以保留:next
query-string参数。
这个怎么样:
def after_sign_in_path_for(resource) sign_in_url = url_for(:action => 'sign_in', :controller => 'users', :only_path => false, :protocol => 'http') if (request.referer == sign_in_url) super else request.referer end end
我接受了Justice的回答并将其更改为使用会话。
据我所知,会话更简单,然后将url添加为param,但是当用户在多个选项卡中浏览网站时,它们可能会出现意外情况。 使用会话的RESTfull较少,但更简单,更清晰。
使用CanCan时,设置重定向路径可以在一个中心位置完成:处理“拒绝访问”exception的地方:
rescue_from CanCan::AccessDenied do |exception| if current_user.nil? session[:next] = request.fullpath puts session[:next] redirect_to new_user_session_path, :alert => exception.message else render :file => "#{Rails.root}/public/403.html", :status => 403 end end
但你可以在任何地方设置它,实际上:
def edit if current_user.roles[:moderator].nil? session[:next] = "/contact" redirect_to new_user_session_path, :alert => "please contact the moderator for access" end # ... end
然后,在ApplicationController
,您可以重用该会话值。 不过,请务必将其删除。
def after_sign_in_path_for(resource) path = '' if session[:next] path = session[:next] session[:next] = nil else path = super end path end
这是我的rescue_from
CanCan的代码。
rescue_from CanCan::AccessDenied do |exception| if current_user.nil? session[:next] = request.fullpath puts session[:next] redirect_to login_url, :alert => "You have to be logged in to continue" else #render :file => "#{Rails.root}/public/403.html", :status => 403 if request.env["HTTP_REFERER"].present? redirect_to :back, :alert => exception.message else redirect_to root_url, :alert => exception.message end end end
它的作用: – 如果用户没有登录,它会重定向到登录页面 – 如果用户已登录,但没有能力查看该操作,则会将其重定向回到具有警报flash消息的根页面