我有这个代码,有效,但我不确定如何?
验证密码,但它是如何做到的?
我知道什么是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
答案 0 :(得分:0)
嗯,这里是validates_confirmation_of
"魔法"发生的只是数据映射器将搜索与您在validates_confirmation_of
(在本例中为:password
)中传递的字段同名的字段,并且最后验证是否_confirmation
他们是平等的。
例如,validates_confirmation_of :email
会让datamapper查找属性email_confirmation
并比较它是否等于:email
。
attr_reader和attr_accessor
attr_reader
和attr_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