validates_confirmation_of:密码不会被触发

Wuk*_*ank 5 validation rspec ruby-on-rails rspec-rails ruby-on-rails-3.1

我有一个非常基本的Admin模型:

class Admin < ActiveRecord::Base
  has_secure_password
  validates_uniqueness_of :email
  attr_accessible :email, :password, :password_confirmation
end
Run Code Online (Sandbox Code Playgroud)

根据手册 has_secure_password还增加了一个validates_confirmation_of :password.如果我是正确的validates_confirmation_of应该总是错误,如果:password:password_confirmation不匹配 - 即使:password_confirmationnil.

我正在使用RSpec进行测试,此测试失败并告诉我这admin 有效的:

admin = Admin.new
admin.email = 'test@example.info'
admin.password = 'secret'
admin.should be_invalid
Run Code Online (Sandbox Code Playgroud)

这个通过:

admin = Admin.new
admin.email = 'test@example.info'
admin.password = 'secret'
admin.password_confirmation = ''
admin.should be_invalid
Run Code Online (Sandbox Code Playgroud)

那么,我做错了什么?

tho*_*edb 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
Run Code Online (Sandbox Code Playgroud)

如您所见,它永远不会确保发送密码确认.但是,您可以自己添加,只要页面上有表单字段,如果未填充,则会发送一个空字符串.

  • 是的,我应该有RTFM:"仅当`password_confirmation`不是'nil`时才执行此检查,默认情况下仅在保存时执行." (http://apidock.com/rails/ActiveModel/Validations/HelperMethods/validates_confirmation_of) (2认同)