validates_confirmation_of:密码

时间:2016-09-08 14:01:20

标签: ruby sinatra datamapper

我有这个代码,有效,但我不确定如何?

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

我知道什么是attr_reader和访问器,但是我真的不明白datamapper如何比较:password with: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 '/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

1 个答案:

答案 0 :(得分:0)

嗯,这里是validates_confirmation_of

docs

"魔法"发生的只是数据映射器将搜索与您在validates_confirmation_of(在本例中为:password)中传递的字段同名的字段,并且最后验证是否_confirmation他们是平等的。

例如,validates_confirmation_of :email会让datamapper查找属性email_confirmation并比较它是否等于:email

attr_reader和attr_accessor

attr_readerattr_acessor只是'快捷方式'定义方法和实例变量。

  • 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