はじめに
railsのソースコードの中で簡単そうなメソッドを探していたら、class_methodsを見つけました。深ぼってみたら、今後の開発に活かしたいと持ったのでその備忘録です。
使い方
class_methods はモジュールのメソッドを、include先のクラスのクラスメソッドとして使ってねという指示。
module MyFeature
extend ActiveSupport::Concern
class_methods do
def greet
puts "こんにちは"
end
end
end
class User
include MyFeature
end
User.greet # => こんにちは
これ、普通に def self.greet で書けばよくない?とおもったのですが、
module MyFeature
def self.greet
puts "こんにちは"
end
end
class User
include MyFeature
end
User.greet # => ❌ エラーになる!
self.greetしたらモジュール自身のメソッドとなり引用先のクラスには渡らない。このように、class_methods を使うことで、モジュールの機能をクラスに自然に拡張できるのが特徴です。
まとめ
- def self.xxx はモジュール自身のメソッドになるので、include先のクラスには渡らない
- class_methods do ... end を使うことで、include先のクラスにクラスメソッドを自然に追加できる