validates_confirmation_of :密码

validates_confirmation_of :password

我有这段代码,可以使用,但我不确定如何使用?

它验证密码,但它是如何做到这一点的?

我知道什么是 attr_reader 和访问器,但并不真正理解 datamapper 如何知道将 :password 与 :password_confirmation 进行比较? DataMapper 有什么神奇之处?

这是我的用户模型:

require 'data_mapper'
require 'dm-postgres-adapter'
require 'bcrypt'

class User

  include BCrypt
  include DataMapper::Resource

  property :id, Serial
  property :username, String
  property :email, String
  property :password_digest, Text

  validates_confirmation_of :password

  attr_reader :password
  attr_accessor :password_confirmation

  def password=(password)
    @password = password
    self.password_digest = BCrypt::Password.create(password)
  end

end

这是我的控制器post:

post '/sign-up' do
    new_user = User.create(:username => params[:username], :email => params[:email], :password => params[:password], :password_confirmation => params[:password_confirmation])
    session[:user_id] = new_user.id
    redirect '/welcome'
  end

嗯,这是 validates_confirmation_of

docs

"magic" 发生的只是数据映射器将搜索与您在 validates_confirmation_of 中传递的字段同名的字段(在本例中为 :password_confirmation 并验证它们是否相等。

例如 validates_confirmation_of :email 将使数据映射器查找属性 email_confirmation 并比较它是否等于 :email.

attr_reader 和 attr_accessor

attr_readerattr_acessor只是'shortcuts'定义方法和实例变量。

  • attr_reader: 创建获取属性的方法
  • attr_writer:创建一个设置属性的方法
  • attr_accessor:同时创建

例如:

class Person

   attr_reader :name
   attr_accessor :gender

end

与以下相同:

class Person

  def name
    @name
  end

  def gender=(gender)
    @gender = gender
  end

  def gender
    @gender
  end

end