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