共通化の方法としては下記があります。
- 共通機能のモジュールを複数コントローラクラスにMix-inする。
- クラスの継承をする。
- 共通処理を行うオブジェクトを別に作成する。
また、コントローラの共通化前にまずはコントローラの中に含まれているモデルに記述するべき処理(ビジネスロジック系の処理)はモデルに移動させるようにしましょう。
共通機能のモジュールをコントローラにMix-inする
共通機能を記述したモジュールを作成して複数のコントローラにincludeする手法です。共有的な特徴を持つコントローラ群に対して共通部分を実装するために使われる手法です。
例
業務アプリケーションで上司のチェックなどが入るような各業務コントローラーがあった場合に、CheckActionsというモジュールを実装してそれを各コントローラクラスからincludeするような作りにします。
ポイント
本当にほぼ同じアクションだけを共有すること。
例えば、全く同じアクション名だったとしても、共通処理が各コントローラによる分岐が入るような複雑性が入っては共通処理にする意味がないです。(逆に複雑性を上げてしまうことになりかねないです。)
以下のような内容がほぼ同じであるアクションだけを共通化しましょう。
- インスタンス変数
- ビューテンプレート
- 関心事のモデル
- セッション操作
モジュールの場所
1 |
app/controllers/concerns |
クラスの継承による共通化
下記のデメリットがあるためアクションの追加はモジュールに任せてクラスでは実装しない。
- モジュールの本来の意味が「機能の追加」であるのに対して継承は「本来の性質」を指すため。
- 本来必要ないクラスに不要なアクションが存在してしまう可能性があるため。
下記の処理を共通化するためにクラス継承による共通化を利用すると良いでしょう。
- privateメソッド
- フィルタ
下記二つに分かれるイメージです。
- アクションを実装するクラス
- 共通処理を提供するだけの基底コントローラクラス
共通処理を提供するだけの基底コントローラクラス
多くのコントローラに関わる処理はApplicationControllerクラスを使うことになるでしょう。
よくある実装例
- ログイン済かチェックをしてしてない場合はログイン画面に遷移させる。
- 権限チェックをし権限がない場合はエラーにする。
- セッションから特定の値を読み書きする。
- 特定のデータをコントローラだけでなくビューからも利用できるようにする。
この記事へのコメントはありません。