Rails Tutorial (2)

6章

コールバックの登録のところで、なんで代入の時だけselfを指定するのか分からなかったので少し調べた。 下が問題のコード。

class User < ActiveRecord::Base
  before_save { self.email = email.downcase }
end

まず、selfが何を指すのかをはっきりさせる。

class User < ActiveRecord::Base
  before_save do 
    puts self #=> #<User:0x007ff3fe00fe48> (Userオブジェクト)
  end
end

ブロックの中のselfはUserのインスタンスだと分かる。

問題のコードに戻る。まず、email.downcaseではUserオブジェクトのemailを小文字にしている。 この時、レシーバ(self)を省略してUser#emailを呼んでいる。

次に、self.email =でUserオブジェクトのemailに代入しているわけだが、 これは実際にはUser#email=を呼んでいる。こちらではレシーバの省略はできないらしい。 これはRubyの文法的な問題でどうしようもない。

結局のところ、getter(User#emailのこと)を呼ぶときにはレシーバの 省略が可能で、setter(User#email=)を呼ぶときにはレシーバを省略できないということが理由だった。