Skip' has_secure_password'基于条件的验证

时间:2017-08-31 23:49:49

标签: ruby-on-rails ruby-on-rails-5 bcrypt

我有以下型号:

class User < ActiveRecord::Base
  has_secure_password
  # ...
end

我试图根据条件跳过has_secure_password 帮助的验证。

所以,搜索后我发现in this answer方式总是跳过验证,但是当我尝试在我的情况下采用此解决方案时(正如我所说,我想跳过它)条件),如下:

class User < ActiveRecord::Base
  has_secure_password validations: :super_admin?

  private

  def super_admin?
    p "role #{role.inspect}"
    role == 'super_admin'
  end
end

......它没有跳过验证。它甚至不会调用super_admin?方法。

提前致谢。

1 个答案:

答案 0 :(得分:0)

对于您的情况,当您为用户创建会话时,您需要跳过的是user.authenticate 下面是使用logical或user.super_admin创建sesion的示例?等于true然后它将通过并且用户可以登录

class SessionsController < ApplicationController

  def create
    user = User.find_by_username(params[:session][:username])
    if user && (user.super_admin? || user.authenticate(params[:session][:password]))
      login user
      flash[:success] = "Successfully login"
      redirect_to users_path
    else
      flash.now[:error] = 'sorry cannot login'
      render 'new'
    end
  end

end
在user.rb中

,删除私人并按以下方式检查

class User < ActiveRecord::Base

  def super_admin?
    p "role #{role.inspect}"
    role == 'super_admin'
  end
end