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