Rails 回调不使用 self

Rails callback not using self

来自 Rails 指南的代码片段:

class User < ActiveRecord::Base
      before_validation :normalize_name, on: :create

      protected
        def normalize_name
          self.name = self.name.downcase.titleize
        end
    end

为什么我们在语句的右侧使用self.name?我们不能说

self.name = name.downcase.titleize

可以,但这可能会使代码不可读或导致歧义。 在两边都使用 self.name 更清楚,这样每个阅读您代码的人都知道会发生什么。

我用 IRB 做了一个小例子来说明会发生什么:

2.1.5 :014 > class User
2.1.5 :015?>   attr_accessor :name
2.1.5 :016?>   def normalize_name
2.1.5 :017?>     self.name = name.downcase
2.1.5 :018?>     end
2.1.5 :019?>   end
 => :normalize_name 
2.1.5 :020 > u = User.new
 => #<User:0x007ff81282a070> 
2.1.5 :021 > u.name = "NAME"
 => "NAME" 
2.1.5 :022 > u.normalize_name
 => "name" 
2.1.5 :023 > 

所以是的,你可以做到。 但是使用 self.name 更干净,所以没有歧义。

仅在使用写访问器时才使用 self 似乎是社区惯例。

# writer
self.name=

# reader
name

定义于:https://github.com/bbatsov/ruby-style-guide#no-self-unless-required

指南中的示例:

# bad
def ready?
  if self.last_reviewed_at > self.last_updated_at
    self.worker.update(self.content, self.options)
    self.status = :in_progress
  end

  self.status == :verified
end

# good
def ready?
  if last_reviewed_at > last_updated_at
    worker.update(content, options)
    self.status = :in_progress
  end

  status == :verified
end