RubyやRailsでメソッドを上書き・処理追加する方法いろいろ

オープンクラス

class Hoge
  def hello
    'HELLO'
  end
end

class Hoge
  def hello
    'hello taro!'
  end
end
p Hoge.new.hello #=> "hello taro!"

aliasでいったんメソッド名を退避するテクニック

class Hoge
  def hello
    'HELLO'
  end
end

class Hoge
  # (3) hello2のなかでold_method(旧helloを使う)
  def hello2
    old_method + " taro!"
  end
  alias old_method hello # (1) helloをold_methodに
  alias hello hello2 # (2) hello2を(1)で置き換えたhelloに
end
p Hoge.new.hello #=> "HELLO taro!"

ActiveSupportのalias_method_chainで上記aliasテクと同じことをする

class Hoge
  def hello
    'HELLO'
  end
end

require 'active_support/core_ext/module/aliasing'
class Hoge
  def hello_with_taro
    hello_without_taro + " taro!"
  end
  alias_method_chain :hello, :taro
end
  • alias_method_chainは2つのルールが自動的に発動する
    • 新しいメソッド名は_with_xxxとして実装する必要がある
    • メソッド_without_xxxという名前に変わる

Module.prependを使って、モジュールに定義したメソッドでクラスのメソッドを上書きする

class Hoge
  def hello
    'HELLO'
  end
end

module HelloFix
  def hello
    super + " taro!" # superはHoge#hello
  end
end
Hoge.send :prepend, HelloFix
p Hoge.new.hello #=> "HELLO taro!"
  • app/config/initializers/配下に置いて、モンキーパッチするときに便利

参考

とても勉強になりました。 www.techscore.com