RoR 模型中的吸气剂

Getters in RoR's model

我正在努力学习 Ruby 和 RoR。 我对 Ruby 的魔法感到困惑:)

class User < ActiveRecord::Base
    require 'digest/sha1'
    validates :login, :password, :email, { presence: true }
    validates :login, :email, { uniqueness: true }

    before_save :hash_password

    private def hash_password
        if password_chanched?
            puts @password.class.name
            puts password
            password = 'test_pass'
            puts password

            # @password = Digest::SHA1.hexdigest(password)      it works
        end
    end
end

控制台:

>> t = User.new login: 'Test', email: 'abc@def.ghi', password: 'trololo'
#<User id: nil, login: "Test", password: "trololo", email: "abc@def.ghi", created_at: nil, updated_at: nil>

>> t.save
NilClass
trololo
test_pass
true

>> t.password
"trololo"

所以我的问题是:

什么是密码 returns?我需要在回调中修改什么?

实际上,这个 before_validation 回调工作得很好:

def downcase_login_and_email
    login.downcase!
    email.downcase!
end

我认为当我写

password = 'test_pass'

我不使用setter(比如any_instance.password = 'test_pass'),但我创建了一个局部变量password 这对 class 实例没有任何意义。

我必须使用 self:

    if password_changed?
        puts password # trololo
        self.password = 'test_pass'
        puts password # test_pass
    end

所以我必须阅读更多关于 Ruby:)