5

我有一个非常基本的管理模式:validates_confirmation_of:密码不被触发

class Admin < ActiveRecord::Base 
    has_secure_password 
    validates_uniqueness_of :email 
    attr_accessible :email, :password, :password_confirmation 
end 

According to the manualhas_secure_password还增加了一个validates_confirmation_of :password。如果我是正确的validates_confirmation_of应该总是错误,如果:password:password_confirmation不匹配 - 即使:password_confirmationnil

我与RSpec的测试和测试失败,并告诉我,admin有效:

admin = Admin.new 
admin.email = '[email protected]' 
admin.password = 'secret' 
admin.should be_invalid 

这一个通行证:

admin = Admin.new 
admin.email = '[email protected]' 
admin.password = 'secret' 
admin.password_confirmation = '' 
admin.should be_invalid 

那么,你到底我做错错误?

+0

在第一种情况下,将密码设置为“秘密”后,“admin.password_confirmation”的值是多少? – Dogbert

+0

'admin.password_confirmation'是'nil'。 – Wukerplank

回答

5

下面的代码为has_secure_password

# File activemodel/lib/active_model/secure_password.rb, line 32 
def has_secure_password 
    attr_reader :password 

    validates_confirmation_of :password 
    validates_presence_of  :password_digest 

    include InstanceMethodsOnActivation 

    if respond_to?(:attributes_protected_by_default) 
    def self.attributes_protected_by_default 
     super + ['password_digest'] 
    end 
    end 
end 

正如你可以看到它永远确保密码确认发送。不过,您可以自己添加,只要您的页面上有表单字段,空字符串将会在未填充时发送。

+2

对,我应该有RTFM:“只有在'password_confirmation'不是'nil'时才执行此检查,默认情况下只在保存时执行。” (http://apidock.com/rails/ActiveModel/Validations/HelperMethods/validates_confirmation_of) – Wukerplank