成功进入DEVISE后,如何将用户重定向回以前需要登录的操作?

时间:2011-08-08 22:32:04

标签: ruby-on-rails redirect login devise

我有一个ajax投票按钮:如果用户点击“竖起大拇指”图像但未登录,那么他们应该会看到一个对话框,要求他们先登录。

要执行此对话框,我使用jQuery和facebox绑定到ajax:failure事件。如果用户未登录,Devise将引发401 Unauthorized .facebox在弹出对话框中加载远程html以进行登录,该对话框显示DEVISE登录表单。

除了成功登录后,一切正常,用户被重定向到主页。如果用户被重定向回他们正在查看的帖子,那么他们可以继续投票,这将更加直观。

是否有实现此行为的最佳做法?

感谢。

3 个答案:

答案 0 :(得分:19)

我在Rails 3上使用Authlogic执行以下操作,也许您可​​以使用它或执行类似的操作:

class ApplicationController < ActionController::Base
  after_filter :store_location
private
  def store_location
    session[:return_to] = request.fullpath
  end

  def clear_stored_location
    session[:return_to] = nil
  end

  def redirect_back_or_to(alternate)
    redirect_to(session[:return_to] || alternate)
    clear_stored_location
  end
end

然后,您可以在登录操作中使用redirect_back_or_to dashboard_path之类的内容。

对于某些控制器/操作,我不想存储位置(例如登录页面)。对于那些我只是跳过过滤器:

class UserController < ApplicationController
  skip_after_filter :store_location
end

在Devise wiki中还有一个关于这样做的页面:https://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-on-successful-sign-in

答案 1 :(得分:4)

在ApplicationController中写下以下内容:

after_filter :store_location
def store_location
  session[:previous_urls] ||= []
  # store unique urls only
  session[:previous_urls].prepend request.fullpath if session[:previous_urls].first != request.fullpath
  # For Rails < 3.2
  # session[:previous_urls].unshift request.fullpath if session[:previous_urls].first != request.fullpath 
  session[:previous_urls].pop if session[:previous_urls].count > 2
end
def after_sign_in_path_for(resource)
  session[:previous_urls].last || root_path
end

来源: https://github.com/plataformatec/devise/wiki/How-To:-Redirect-back-to-current-page-after-sign-in,-sign-out,-sign-up,-update

答案 2 :(得分:-1)

使用cookie。获取他们尝试去的window.location.href并将其存储为cookie。在您的主页上,检查文档就绪功能中是否存在此cookier,如果在那里则重定向