Я следую руководству Майкла Хартла RoR, и он освещает основы шифрования паролей. Это модель пользователя, которая в настоящее время стоит:
class User < ActiveRecord::Base
attr_accessor :password
attr_accessible :name, :email,: password, :password_confirmation
email_regex = /^[A-Za-z0-9._+-][email protected][A-Za-z0-9._-]+\.[A-Za-z0-9._-]+[A-Za-z]$/
#tests for valid email addresses.
validates :name, :presence => true,
:length => {:maximum => 50}
validates :email, :presence => true,
:format => {:with => email_regex},
:uniqueness => {:case_sensitive => false}
validates :password, :presence => true,
:length => {:maximum => 20, :minimum => 6},
:confirmation => true
before_save :encrypt_password
private
def encrypt_password
self.encrypted_password = encrypt(password)
end
def encrypt(string)
string
end
end
Я уже писал предыдущий вопрос о before_save
, и получается, что то, что я случайно сделал, написано моим encrypt_password как:
def encrypt_password
@encrypted_password = encrypt(password)
end
Я понимаю, что если self.encrypted_password устанавливает атрибут encrypted_password, но почему @encrypted_password не делает этого? В ответе на предыдущий пост о before_save
не работает кто-то сказал, что переменная экземпляра была "забыта" после того, как метод закончился тем, как я его первоначально закодировал - почему это так? Может кто-нибудь объяснить, как я и @работают по-другому в контексте вышеприведенного кода?
ПРИМЕЧАНИЕ. Я уже рассмотрел сообщения здесь и здесь, но они оба говорят, что "self" вызывает метод attribute =
, и я даже не понимаю, как этот метод может существовать здесь, так как я его никогда не создавал или не объявлял encrypted_password w/attr_accessor
. Поэтому я все еще смущен, и это не повторная публикация этих вопросов.