我想在将用户的电子邮件地址保存到 Rails 中的数据库之前将其小写。我在此页面上使用此代码:
class User < ActiveRecord::Base
before_save {self.email = email.downcase}
end
如果我写它也可以self.email = self.email.downcase
,但如果我写它就不起作用email = email.downcase
。什么情况下可以self
省略?
我想在将用户的电子邮件地址保存到 Rails 中的数据库之前将其小写。我在此页面上使用此代码:
class User < ActiveRecord::Base
before_save {self.email = email.downcase}
end
如果我写它也可以self.email = self.email.downcase
,但如果我写它就不起作用email = email.downcase
。什么情况下可以self
省略?
self
当希望在分配的左侧使用设置器1时,必须始终提供,例如or 2。self.x = val
self.x += val
self
当没有隐藏方法的局部变量时,可以省略 getter(只是普通的方法调用)。
x = val
or形式的表达式x += val
- 也就是说,没有self
-总是分配给局部变量x
。在这种情况下,这意味着将一个值分配给局部变量email
(不要与 混淆self.email
),然后在块退出时将其丢弃。
1请参阅Ruby 中的 attr_accessor 是什么?了解 getter/setter 的实现方式。
2当 ruby 看到self.x = y
它时,它会像对待它一样对待它self.__send__(:x=, y)
。也就是说,setter(这只是一个名称中带有尾随等于的普通方法)被神奇地调用。
email = email.downcase
创建一个新变量,覆盖 的类综合email
。我的经验法则是总是在属性前加上self
. 虽然 Ruby 允许您这样做,但这是POLS或最小惊喜原则的一部分。当您与其他开发人员一起工作时,最好不要让他们深入研究您的代码,并且只知道电子邮件是一个属性。底线,不要省略self
。
看在上帝的份上,把你的代码留出一点空间。可读性是关键。
before_save { self.email.downcase! }