使用Devise after_sign_in_path_for重定向循环

时间:2010-12-02 00:33:36

标签: ruby-on-rails ruby-on-rails-3 devise

我有一点菜鸟问题。我想设计重定向到用户访问的最后一页。所以我做了以下......

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的替代方案感兴趣。

4 个答案:

答案 0 :(得分:12)

答案 1 :(得分:2)

这个怎么样:

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

答案 2 :(得分:2)

我接受了Justice的回答并改为使用会话。

据我所知,会话更简单,然后将url添加为param,但是当用户在多个选项卡中浏览网站时,它们可能会出现意外情况。使用会话的RESTfull较少,但更简单,更清晰。

使用CanCan时,设置重定向路径可以在一个中心位置完成:处理“拒绝访问”例外的地方:

  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

答案 3 :(得分:0)

以下是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

它的作用:   - 如果用户未登录,则会重定向到登录页面   - 如果用户已登录但无法查看操作,则会将其重定向回到具有警报闪烁消息的根页面