我正在努力学习Ruby和RoR。 我对Ruby的魔法感到困惑:)
class User < ActiveRecord::Base
require 'digest/sha1'
validates :login, :password, :email, { presence: true }
validates :login, :email, { uniqueness: true }
before_save :hash_password
private def hash_password
if password_chanched?
puts @password.class.name
puts password
password = 'test_pass'
puts password
# @password = Digest::SHA1.hexdigest(password) it works
end
end
end
控制台:
>> t = User.new login: 'Test', email: 'abc@def.ghi', password: 'trololo'
#<User id: nil, login: "Test", password: "trololo", email: "abc@def.ghi", created_at: nil, updated_at: nil>
>> t.save
NilClass
trololo
test_pass
true
>> t.password
"trololo"
所以我的问题是:
密码返回什么?我有什么要在回调中修改的?
实际上,这个before_validation回调工作正常:
def downcase_login_and_email
login.downcase!
email.downcase!
end
答案 0 :(得分:0)
我认为当我写作
password ='test_pass'
我不使用setter(比如 any_instance.password ='test_pass'),但我创建了一个本地变量 password ,这对类没有任何意义实例
我必须使用 self :
if password_changed?
puts password # trololo
self.password = 'test_pass'
puts password # test_pass
end
所以我必须阅读更多关于Ruby的内容:)