【问题标题】:How to Redirect Unconfirmed Users Using Ruby on Rails and the Devise Gem如何使用 Ruby on Rails 和 Devise Gem 重定向未经确认的用户
【发布时间】:2012-01-22 00:34:24
【问题描述】:

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

我的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] 值并在该值“未确认”但看守没有发送有关用户的其他数据时重定向到适当的页面。

【问题讨论】:

  • 你搞定了吗?

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


【解决方案1】:
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

【讨论】:

  • 仅供参考...此时这不起作用。如果你想这样做,你需要在一个自定义的 FailureApp 中处理它。我在下面的答案中的说明。
【解决方案2】:

您需要一个自定义的 FailureApp 来执行此操作(并且您需要在您的路线等中定义 /unconfirmed,就像任何其他 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

config/initializers/devise.rb:

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

【讨论】:

  • 你是我的英雄!
【解决方案3】:

我认为要使这项工作正常进行,您需要将 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 文件中(或修改您的 routes.rb 文件中包含 devise_for :users 的行 ...或任何您的模型名称):

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

     protected
     def confirmation_required?
       false
     end
    

【讨论】:

    【解决方案4】:

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

    config.allow_unconfirmed_access_for = nil 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多