Активные записи обратных вызовов. Как они могут получить доступ к переменным / области? - PullRequest
0 голосов
/ 27 декабря 2011

Я новичок в Ruby on Rails и зациклен на использовании обратных вызовов Active Record.Я знаю, как использовать их, но я пытаюсь действительно понять , что происходит, и я не понимаю этого.Моя путаница связана с переменными областями действия в Ruby.

Вот простой класс Active Record для пользователя с полями: электронная почта, password_hash, password_salt

class User < ActiveRecord::Base

    attr_accessor :password
    before_save :encrypt_password

    #validation
    validates :password, :confirmation => true
    validates :email, :password, :presence => true
    validates :email, :uniqueness => true

    #When saving the user, encrypt the password
    def encrypt_password

        #First check if the password is present
        if (password.present?)

            #encrypt the password
            self.password_salt = BCrypt::Engine.generate_salt
            self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
        end

    end

end

В методе "encrypt_password"Как доступна переменная «пароль»?Это то же самое, что self.password (объект var?), И это не то же самое, что @password?(почему?)

В самой процедуре шифрования я вызываю self.password_salt.Я заметил, что я могу просто ввести «password_salt» (без ссылки на себя), и это не работает.Почему бы и нет?Почему это отличается от @password_salt?

Извините, если это звучит как нубиш, я потратил пару часов на это, пытаясь понять это.

1 Ответ

3 голосов
/ 27 декабря 2011

1) Это то же самое, что и self.password. ActiveRecord определяет методы, а не переменные экземпляра для доступа к материалам, связанным с базой данных. Вот почему вы не можете получить к нему доступ с помощью @password.

2) Вам нужно использовать self.password_salt=, потому что в противном случае вы бы присваивали локальную переменную, а не вызывали метод.

PS: Обратные вызовы - это только вызовы методов вашего объекта. Разница лишь в том, что Rails вызывает их для вас, а не для себя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...