🏹

【Rails】decorator, model, helperの使い分け

2023/01/23に公開

はじめに

本記事では、decoratorメソッド, modelメソッド, helperメソッドの使い分けについてまとめます。

Railsは、Model, View, Controllerで構成されます。規模が大きくなるにつれ、これらのファイルも大きくなり、中でも特にcontrollerはフロント側の処理もバックエンド側の処理も記述するため膨大になりがちです。

そこで、decoratorメソッド, modelメソッド, helperメソッドは、ViewやControllerの記述を減らす役割を担います。
View, Controllerの記述は少なければ少ないほどエラーも少なく、更新しやすく、美しいです。
Skinny Controller, Fat Model

本記事では、decoratorメソッド, modelメソッド, helperメソッドの使用を促し、View, Controllerを綺麗に保つことを目標とします。

decoratorメソッドの役割

decoratorメソッドは、モデルに対して見た目の処理をする場合に使用します。

モデルに依存するため引数を必要とせず、ちょっと加工してViewに出したい時や分岐させて表示を出し分けたい時に使います。
Viewに特化した機能を持たせることで他モデルとの混同を防ぐことができます。

例) 配列のデータを加工して1行のstringで表示したい時

[富士山, 山中湖, 駿河湾] → “富士山 / 山中湖 / 駿河湾”
データを表示のために加工するときに使用します。

主にViewの記述が膨大になるときに救世主となります。小手先の処理に一番適しており、decoratorメソッド, modelメソッド, helperメソッドの中では最も使用頻度が高くなるでしょう。

decoratorメソッドは、”モデルをデコる”イメージを持つといいと思います。
くっつけたり切ったりする感じ。

modelメソッドの役割

modelメソッドは、Modelに対してデータの処理をする場合に使用します。

modelファイルに記述するため、モデルに依存し引数を必要としません。加工よりは、処理をする場合に使用します。
具体的なオブジェクトを表現することで、ビジネスロジック的な役割を果たします。

例) 料金計算処理

(金額)×(数量)=(請求金額)
請求金額のようにdbには保存しないけど、保持しておきたいデータを扱う時に使用します。

helperメソッド, decoratoメソッドよりも目につきやすく最初に手をつけがちですが、主にプロジェクトの初めに設計されるため、普段の保守, 運用業務では最も使用頻度が低いでしょう。

modelメソッドは、”データを作る”イメージを持つといいと思います。
常に稼働する重たいマシンのような感じ。

helperメソッドの役割

helperメソッドは、特定のモデル領域に収まらないメソッドを定義したい場合に使用します。

Controllerをrails generateで生成する際に、関連してhelperも自動生成されますが、Controllerに依存しているわけではなく、どこでも自由に呼び出すことができます。

例) フォームヘルパー

Railsのhelperメソッドform_tag, form_for, form_with
フォームヘルパーはformタグを生成し、これらは特定のモデルに依存しません。

decoratorメソッド, modelメソッド, helperメソッドの中で全てのモデルに影響できる最も自由度の高い機能であると言えます。それゆえに多用すると煩雑になるのでよく検討しましょう。

helperメソッドは、”みんなを助ける”イメージを持つといいと思います。
みんな使えて便利な感じ。

また、

  • いずれテーブル管理やモデル化する機能の仮対応
  • モデルでは吸収できない異質なものを扱う時

などにも使用するので、
苦し紛れの仮対応, 一時対応, 特別対応という感じ。

まとめ

  • decoratorメソッド → Viewに特化, データの加工
  • modelメソッド → ビジネスロジック, データの作成
  • helperメソッド → 仮対応, 特定のモデル領域に収まらないメソッド

新しくメソッドを追加したくなった時、この記事を参照してみてください。
みんなで ViewをDRYに!Controllerをシンプルに!

Discussion