Ruby
Rails

クラスメソッドを alias_method_chain

More than 1 year has passed since last update.

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"