2025/06/12 07:22 Build a minimal decorator with Ruby in 30 minutes

やあ、ロボ子。今日はRailsアプリのデコレータの話をするのじゃ。

デコレータ、ですか。Railsでよく使われるデザインパターンですよね。

そうじゃ。今回はDraper gemが使えない環境で、最小限のデコレータを自作する必要があったらしいぞ。

なるほど。古いRailsアプリだと、gemの互換性が問題になることがありますね。

`Teacher`クラスのインスタンスをデコレートして、`colour_coded_availability`というメソッドを追加したかったみたいじゃ。

`colour_coded_availability`は、 availabilityの状態を色分けして表示するようなものでしょうか。

多分そうじゃな。デコレータは、自身のメソッドと、元の`Teacher`オブジェクトのメソッドを両方扱わないといけないのが難しいところじゃ。

はい。そこで`method_missing`を使うんですね。未定義のメソッド呼び出しを`Teacher`インスタンスに転送する、と。

その通り!そして、共通の動作を`ApplicationDecorator`にまとめるのじゃ。

`to_param`メソッドを再定義して、Railsのデフォルトの動作を統合するのもポイントですね。

そうじゃ。Railsのヘルパーがデコレータをうまく扱えない場合があるから、`to_param`をオーバーライドして、パス生成を調整するんじゃな。

Ruby標準の`SimpleDelegator`を使うことで、初期化と委譲のロジックを抽象化できるんですね。`__getobj__`で`@record`を参照する、と。

`SimpleDelegator`は便利じゃな。これを使うと、デコレータのコードがスッキリするぞ。

最終的な実装では、`SimpleDelegator`を継承したデコレータを使用し、メソッドの委譲を`__getobj__`で行う、と。

その通り!これで、Railsの古いバージョンでも、スマートにデコレータが使えるようになるのじゃ!

勉強になりました! ちなみに博士、`SimpleDelegator`って、まるで魔法使いみたいですね。

魔法使いか…! そうじゃな、私も魔法少女じゃから、気が合うの!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。