Rails回调不使用self

时间:2015-03-11 14:01:41

标签: ruby-on-rails ruby 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

2 个答案:

答案 0 :(得分:2)

仅在使用写访问器时才使用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

答案 1 :(得分:1)

你可以,但它可能使代码难以理解或导致歧义。 在双方使用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比较干净,所以没有歧义。