В этом примере свойство password_confirmation добавляется в модель с помощью помощника attr_accessor, который устанавливает для вас геттер и мутатор в одной строке кода:
attr_accessor :password_confirmation
Эта строка такая же, как если бы вы написали это:
def password_confirmation
@password_confirmation
end
def password_confirmation=(pwd_conf)
@password_confirmation = pwd_conf
end
методы доступа к паролю явно определены в модели:
def password
@password
end
def password=(pwd)
@password = pwd
return if pwd.blank?
create_new_salt
self.hashed_password = User.encrypted_password(self.password, self.salt)
end
Эти виртуальные атрибуты определены в коде модели, поскольку они не существуют в таблице базы данных, из которой модель получает остальные свои атрибуты, потому что вы не хотите, чтобы они сохранялись в базе данных.