Если вы позволите мне, я бы хотел перефразировать ответ.
Я объяснил в этом посте , что как только вы создадите (rails-) модель с той же(единственное) имя в качестве одного из (множественных) имен таблиц вашей базы данных, «магия» рельсов создаст установщики и получатели для изменения записей вашей таблицы.
Это потому, что ваша модель наследует все методы изActiveRecord :: Base Class, который определяет основные средства доступа CRUD (Create, Read, Update, Delete).
Ключевым моментом, связанным с вашим вопросом, является то, что вы не знаете, как rails реализуетпеременная экземпляра, связанная с вашим столбцом таблицы базы данных, И вы не должны.:) Все, что вам нужно знать, это то, что в этот момент у вас есть сеттеры и геттеры, доступные для CRUD (создание, чтение, обновление, удаление) столбца вашей базы данных «encrypted_password».
В вашем примеревозможно, rails использует переменную экземпляра с именем @encrypted_password, возможно, rails использует переменную хеш-экземпляра с именем @attributes ["encrypted_password"], или, возможно, rails использует переменную экземпляра с именем @ you_will_never_guess_encrypted_password.
-
И хорошо, что вы не знаете о поведении внутренних рельсов с переменными экземпляра.В 2019 году дальнейшее развитие Rails может привести к тому, что платформа будет использовать @ complex-hash-instance-variable для хранения значения encrypted_password.
На самом деле лучший подход - позволить rails управлять своим "личным" делом.";) с переменными экземпляра , и просто используйте методы getter и setter, которые он вам предоставляет.Таким образом, ваше приложение все еще будет работать с encrypted_password в следующем столетии (я надеюсь, что ^^).
Так что, если вы используете @encrypted_password, оно может работать с какой-то «воображаемой» версией rails и больше не будет работатьс другими версиями рельсов.На самом деле с текущей версией rails это не работает.
-
Второй ключевой момент заключается в том, что когда вы хотите использовать метод получения " encrypted_password "Rails создан для вашего столбца таблицы базы данных encrypted_password, вы добавляете к нему префикс" self", чтобы сказать Ruby:" хорошо, я хочу использовать метод encrypted_password моего пользователя переменная экземпляра. "
В Ruby метод вызывается путем передачи его имени получателю.Вы пишете это так:
my_receiver.my_method
В вашем случае мы передаем метод encrypted_password в переменную экземпляра User .Но мы не знаем, как будет названа эта переменная экземпляра, поэтому мы используем слово self , чтобы сказать Руби: «Я говорю о любой переменной экземпляра класса User , котораявызывает метод encrypted_password ".
Например, мы могли бы назвать нашу переменную экземпляра" toto ":
toto = User.new
, чтобы toto.encrypted_password
отображал зашифрованный пароль, и self в этом самом случаев нашем коде будет ссылка на.
Однако, благодаря Ruby, , если вы не дадите какой-либо получатель при вызове метода , Ruby будет предполагать, что вы передадите его self .
Ссылка: Руководство программиста Pragmatic
Так что в вашем примере вам даже не нужно ставить "я".в качестве префикса.Вы могли бы написать это так:
class User < ActiveRecord::Base
def encrypt_password
encrypted_password = encrypt(password)
end
end
Надеюсь, это поможет прояснить эту интересную тему.