validates_confirmation_of:密码不会被触发

时间:2011-09-24 11:56:09

标签: ruby-on-rails validation rspec ruby-on-rails-3.1 rspec-rails

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

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

According to the manual 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

这个通过:

admin = Admin.new
admin.email = 'test@example.info'
admin.password = 'secret'
admin.password_confirmation = ''
admin.should be_invalid

那么,我到底做错了什么?

1 个答案:

答案 0 :(得分: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

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