Ruby on rails 3.1 如何使用Ruby on Rails和Desive Gem重定向未经确认的用户

Ruby on rails 3.1 如何使用Ruby on Rails和Desive Gem重定向未经确认的用户,ruby-on-rails-3.1,devise,warden,Ruby On Rails 3.1,Devise,Warden,我想更改Desive的用户登录行为,以便在未确认用户时将其重定向到其他页面 我的app/controllers/sessions\u controller.rb中有以下代码: # POST /user/sign_in def create @user = warden.authenticate!(:scope => :user) sign_in @user respond_with @user, :location => after_sign_i

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

我的
app/controllers/sessions\u 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
当用户输入正确的用户名/密码且未确认时,管理员将发出一个错误,该错误将用户重定向到登录页面(代码302)。同时,这将使flash[:alert]变为“未确认”

有没有办法将未经确认的用户重定向到特定页面

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

class SessionControllerclass 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
def创建 @user=user.where(:email=>params[:user][:email])[0]#您现在就可以获得用户了 如果@user.confirm? 超级的 其他的 将#重定向到#所需的#路径#或其他您想要执行的操作 结束 结束 结束
如果您不想允许未经确认的用户登录,请将此行输入designe.rb 成功注册后

config.allow_unconfirmed_access_for = nil 

我认为,要使这项工作正常进行,您需要将Brian的答案与routes.rb文件中的一个附加内容结合起来

我现在就要测试它,所以如果我让它工作起来,我会给你一个更新。(编辑:我已经在本地工作了)

以下是您需要做的:

  • 你的应用程序/app/controllers中创建一个名为
    会话\u 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
    
  • 您需要将其添加到您的
    用户
    模型中:

     protected
     def confirmation_required?
       false
     end
    

  • 您需要一个自定义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
    

    你能用吗?仅供参考。。。这在这一点上不起作用。如果你想这样做,你需要在自定义FailureApp中处理它。下面是我的答案。你是我的英雄!
    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.warden do |manager|
        manager.failure_app = CustomFailure
      end