Ответ
Ответ прост: видимость области действия.
def encrypt_password
self.encrypted_password = encrypt(password)
end
Существует (или, скорее, должно быть во время выполнения) что-то , называемое password
. В вашем случае это атрибут из базы данных. Но это также может быть локальной переменной. Если такое имя не найдено, появится ошибка.
Но у вас есть для префикса encrypted_password
с self
, чтобы явно указать, что вы собираетесь обновить атрибут экземпляра. В противном случае будет создана новая локальная переменная encrypted_password
. Очевидно, не тот эффект, который вы хотели.
Больше объяснений
Вот небольшой фрагмент кода
class Foo
attr_accessor :var
def bar1
var = 4
puts var
puts self.var
end
end
f = Foo.new
f.var = 3
f.bar1
выход
4
3
Итак, как мы видим, var
назначается без ключевого слова self
, и поэтому теперь в области видимости есть два имени var
: локальная переменная и атрибут экземпляра. Атрибут экземпляра скрыт локальной переменной, поэтому, если вы действительно хотите получить к нему доступ, используйте self
.