使用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消息的根页面