RoR 模型中的吸气剂
Getters in RoR's model
我正在努力学习 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"
所以我的问题是:
什么是密码 returns?我需要在回调中修改什么?
实际上,这个 before_validation 回调工作得很好:
def downcase_login_and_email
login.downcase!
email.downcase!
end
我认为当我写
password = 'test_pass'
我不使用setter(比如any_instance.password = 'test_pass'),但我创建了一个局部变量password 这对 class 实例没有任何意义。
我必须使用 self:
if password_changed?
puts password # trololo
self.password = 'test_pass'
puts password # test_pass
end
所以我必须阅读更多关于 Ruby:)
我正在努力学习 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"
所以我的问题是:
什么是密码 returns?我需要在回调中修改什么?
实际上,这个 before_validation 回调工作得很好:
def downcase_login_and_email
login.downcase!
email.downcase!
end
我认为当我写
password = 'test_pass'
我不使用setter(比如any_instance.password = 'test_pass'),但我创建了一个局部变量password 这对 class 实例没有任何意义。
我必须使用 self:
if password_changed?
puts password # trololo
self.password = 'test_pass'
puts password # test_pass
end
所以我必须阅读更多关于 Ruby:)