如何使用Ruby on Rails和Devise Gem重定向未确认的用户

时间:2011-12-16 13:33:31

标签: ruby-on-rails-3.1 devise warden

我想更改设备的用户登录行为,以便在未确认该用户时将用户重定向到其他页面。

我的app/controllers/sessions_controller.rb中有以下代码:

  # POST /user/sign_in
  def create

    @user = warden.authenticate!(:scope => :user) 
    sign_in @user
     respond_with @user, :location => after_sign_in_path_for(@user)

  end

当用户输入正确的用户名/密码并且未确认时,Warden将引发错误,将用户重定向到登录页面(代码302)。与此同时,这会将flash [:alert]置于“未经证实”。

有没有办法将未经证实的用户重定向到特定页面?

我想解决这个问题的方法是读取flash [:alert]值,如果值为“未确认”,则重定向到相应的页面,但是warden没有发送有关用户的其他数据。

4 个答案:

答案 0 :(得分:2)

class SessionsController < Devise::SessionsController
  def create
    @user = User.where(:email => params[:user][:email])[0] # you get the user now
    if @user.confirmed?
      super
    else
      redirect_to YOUR_DESIRED_path # or something else you want to do
    end
  end
end

答案 1 :(得分:1)

您需要自定义FailureApp才能执行此操作(并且您需要在路由中定义/取消确认等,就像任何其他Rails操作一样):

LIB / custom_failure.rb

class CustomFailure < Devise::FailureApp
  def redirect_url
    if warden_message == :unconfirmed
      '/unconfirmed'
    else
      super
    end
  end

  # You need to override respond to eliminate recall
  def respond
    if http_auth?
      http_auth
    else
      redirect
    end
  end
end

配置/初始化/ devise.rb:

  config.warden do |manager|
    manager.failure_app = CustomFailure
  end

答案 2 :(得分:0)

我认为要实现这一点,您需要将Brian的答案与routes.rb文件的添加相结合。

我现在要测试它,所以如果/当我开始工作时我会给你一个更新。 (编辑:我在本地工作)。

以下是您需要做的事情:

  1. your_rails_app/app/controllers中创建一个名为sessions_controller.rb的新文件,该文件应如下所示:

    class SessionsController < Devise::SessionsController
      def create
        @user = User.where(:email => params[:user][:email])[0] # you get the user now
        if @user.confirmed?
          super
        else
          redirect_to YOUR_DESIRED_path # or something else you want to do
        end
      end
    end
    
  2. 将以下行添加到routes.rb文件中(或修改包含devise_for :users的routes.rb文件中的行...或者调用任何模型的行):

    devise_for :users, controllers: { sessions: "sessions" }
    
  3. 您需要将其添加到User模型中:

     protected
     def confirmation_required?
       false
     end
    

答案 3 :(得分:-1)

如果您不想允许未经证实的用户登录,请将此行放入devise.rb 成功注册后。

config.allow_unconfirmed_access_for = nil