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=)を呼ぶときにはレシーバを省略できないということが理由だった。