2017/11/22追記
Rails5からalias_method_chain
は非推奨なので Module#prepend
を使いましょう。
メソッドをオーバーライドしたいけど元のメソッドを残したい時
ActiveSupport の alias_method_chain を使う。
class A
def foo
"foo"
end
end
class B < A
def foo_with_bar
"foo bar"
end
alias_method_chain :foo, :bar
end
a = A.new
p a.foo #=> "foo"
b = B.new
p b.foo #=> "foo"
p b.foo_without_bar #=> "foo bar"
alias_method_chain はインスタンスメソッド用なのでクラスメソッドに適用したい場合は以下のように記述する。
class A
def self.foo
"foo"
end
end
class B < A
class << self
def foo_with_bar
"foo bar"
end
alias_method_chain :foo, :bar
end
end
p A.foo #=> "foo"
p B.foo #=> "foo"
p B.foo_without_bar #=> "foo bar"