Change The World

changeworldのblogですよん。

既存メソッドに簡単に機能を追加する方法

Redmine Advent Calendar jp 2011 Changeworld on Redmine 5日目の参加記事です。

既存メソッドに追加する方法をご紹介します。

Redmine を使っていると「ここの仕様はこうしたい…」という事が多々あります。その際、 Redmine に直接手を入れても良いのですが、そうすると Redmine のコミッターとなって本家に採用してもらわない限り、Version up の度に毎回修正する必要があり、少々面倒です。

そんな時に、メソッドを上書きするけど、元のメソッドも残すことが出来る方法があります。それが “alias_method_chain” です。

alias_method_chain :validate, :issue_extensions

の様に書くと、validate を validate_with_issue_extensions でオーバーライドしてくれます。ここに変更内容を書くと validate_with_issue_extensions として動作時は変更内容のメソッドとして動作し、 validate_without_issue_extensions として呼び出せば、既存のメソッドとして使い分けることが出来ます。

但し、このメソッドを使うと動かなくなる部分があります。

そう、それが Redmine Advent Calendar jp 2011 - 1日目でご紹介した「config.cache_classes = true でなければ動かない部分がある」というものです。

cache している class をオーバーライドして、実現しているため、 cache をしない設定にしてしまうと動きませんので、ご注意ください。