我希望在将用户的电子邮件地址保存到rails中的数据库之前将其缩小。我在this page使用此代码:
class User < ActiveRecord::Base
before_save {self.email = email.downcase}
end
如果我写self.email = self.email.downcase
它也有效,但如果我写email = email.downcase
则不起作用。在哪种情况下可以省略self
?
答案 0 :(得分:7)
self
必须始终。 self.x = val
或self.x += val
2 。
self
。
表单x = val
或x += val
的表达式 - 也就是说,没有self
- 总是分配给本地变量x
。在这种情况下,这意味着将一个值分配给局部变量email
(不要与self.email
混淆),然后在块退出时将其丢弃。
1 有关如何实施getter / setter,请参阅What is attr_accessor in Ruby?。
2 当ruby看到self.x = y
时,它会将其视为self.__send__(:x=, y)
。也就是说,setter(它只是名称中尾随等号的普通方法)被神奇地称为。
答案 1 :(得分:1)
email = email.downcase
创建一个新变量,覆盖email
的类合成。我的经验法则是始终使用self
作为前缀属性。虽然Ruby允许你做任何一件事,但这是 POLS 或最低惊喜原则的一部分。当您与其他开发人员合作时,如果他们不必深入挖掘您的代码,并且只知道电子邮件是一个属性,那就更好了。底线,不要忽略self
。
为了上帝的缘故,将代码空间化了一点。可读性是关键。
before_save { self.email.downcase! }