Rails —自我与@
|
我正在遵循Michael Hartl的RoR教程,它涵盖了密码加密的基础知识。这是目前的用户模型:
class User < ActiveRecord::Base
attr_accessor :password
attr_accessible :name, :email,: password, :password_confirmation
email_regex = /^[A-Za-z0-9._+-]+@[A-Za-z0-9._-]+\\.[A-Za-z0-9._-]+[A-Za-z]$/
#tests for valid email addresses.
validates :name, :presence => true,
:length => {:maximum => 50}
validates :email, :presence => true,
:format => {:with => email_regex},
:uniqueness => {:case_sensitive => false}
validates :password, :presence => true,
:length => {:maximum => 20, :minimum => 6},
:confirmation => true
before_save :encrypt_password
private
def encrypt_password
self.encrypted_password = encrypt(password)
end
def encrypt(string)
string
end
end
我发布了一个先前的问题,关于before_save
行不通,事实证明,我不小心做的事情是将我的crypto_password写为:
def encrypt_password
@encrypted_password = encrypt(password)
end
我知道,如果self.encrypted_password设置了encryption_password属性,但是@encrypted_password为什么也不能这样做呢?在对上一个有关“ 1”不起作用的帖子的答复中,有人说实例变量在方法以我原来的编码方式结束后被“忘记了”,为什么会这样呢?有人可以在上面的代码中解释self和@的不同之处吗?
注意:我已经看过这里和这里的帖子,但是他们都说\“ self \”正在调用attribute =
方法,而且我什至不知道该方法在这里可能存在的原因,因为我从未创建过它,或者声明带有“ 5”的加密密码。因此,我仍然感到困惑,这不是重新发布这些问题。
没有找到相关结果
已邀请:
3 个回复
遣莫捅炭
的访问器,因为the7ѭ表中存在一个具有该名称的字段。 您添加到表格中的任何字段都将通过
自动变为可用。 这是Michael Hartl \的教程在
表中创建
字段的地方。 还要查看链接页面中的
(清单7.3),作者正在测试其中是否存在
字段。 更新: 正如@mu所指出的,
用于Ruby实例变量(aka \“ iv \”)。但是ѭ6是Rails定义的“属性”,不是实例变量。 如果运行
,您将看到存在一个名为
的iv,其类型为
。 在那个iv内部是ѭ6的存储位置。 Rails为“ 6”定义了访问器方法,该方法获取/设置该方法的数据。 属性在
中。 请注意,您还可以通过
类中调用的
获取/设置数据(但是访问器方法是实现此目的的便捷方法)。
唤副埂侧壬
在您的情况下,我们将方法cryptorated_password传递给User实例变量。但是我们不知道该实例变量的命名方式,因此我们使用self来告诉Ruby:“我在谈论User类的任何实例变量,该实例变量都调用了cryptod_password方法”。 例如,我们可以将实例变量命名为\“ toto \”:
因此ѭ26将显示加密的密码,在这种情况下,我们的代码中的self将引用toto。 但是,多亏了Ruby,如果您在调用方法时不给任何接收者,Ruby会假定您将其传递给self。 参考:实用程序员指南 因此,在您的示例中,您甚至无需将\“ self。\”作为前缀。 你可以这样写:
我希望这有助于阐明这个有趣的主题。
逆捐凶撤小