Ruby on rails 保存前在中设置参数
这与其说是一个如何做的问题,不如说是一个为什么的问题。请考虑下面的例子,我想在保存之前设置一个默认的电子邮件。Ruby on rails 保存前在中设置参数,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,这与其说是一个如何做的问题,不如说是一个为什么的问题。请考虑下面的例子,我想在保存之前设置一个默认的电子邮件。 class Organization < ActiveRecord::Base before_save :set_default_email def set_default_email email ||= 'info@'+ domain end end 然而,考虑到ruby中默认的接收者是self(这就是它理解域等的原因),self.email和email
class Organization < ActiveRecord::Base
before_save :set_default_email
def set_default_email
email ||= 'info@'+ domain
end
end
然而,考虑到ruby中默认的接收者是self(这就是它理解域等的原因),self.email和email不应该是一回事吗 否,Ruby假设构造
variable=value
是局部变量赋值。这就是为什么在setter方法中,必须显式地指向接收方 如果你不使用self。你要做的是定义一个局部变量,而不是调用setter来扩展其他的答案,如果你分解得到
email = email || 'info@'+ domain
这相当于
email = self.email || 'info@'+ domain
self.email
为零,因此将计算为
email = 'info@'+ domain
它设置了一个局部变量,但不调用email=
方法
这就是为什么总是使用
self.
而不是依赖Ruby的默认作用域是一个很好的实践的原因。它的可读性也要高得多:另一个程序员扫描你的代码时很容易发现,当你执行self.email=
(或者在你的例子中是self.email | |=
)时,你调用的是setter方法,而不是定义一个局部变量。啊,这就解释了。谢谢,谢谢,这很有道理,谢谢。为了清晰起见,我曾经在任何地方都明确提到self,直到rubocop开始抱怨它。哦,好吧!rubocop基于ruby风格指南,该指南说“在不需要的地方避免self(仅在调用自写访问器时才需要)。”。我认为样式指南在这里是错误的:我想不出任何理由不键入self。
。通过减少字符数来提高代码效率没有问题,使用self有一定的可读性好处。
如果我被ruby社区否决,那没关系,不过我不会改变:)
email = 'info@'+ domain