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
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