concernによるメソッドのMVC外部への切り出し

【結論】

・アプリケーションがある程度の規模になると
 MVCに沿ってメソッドの切り分けを行っても、
 コントローラーやモデルが肥大化して
 拡張性・メンテナンス性に悪影響を及ぼす

ActiveSupport::Concernを用いれば
 MVC外部にメソッドを切り出す事が可能になる

【目次】

【本題】

MVC外部に切り出しが必要な場面

Railsは、MVCアーキテクチャーに基づいて設計されており、
それぞれの役割に応じてコードを記述する場所を変えることで
拡張性とメンテナンス性を担保しています。

しかし、実際の業務レベルのアプリケーションは
様々な機能を実装する必要があり、MVCレベルの切り出しだけでは
コントローラやモデルが肥大化してしまい、
拡張性・メンテナンス性が落ちてしまいます。

そこで登場するのが、MVC外部へのメソッドの切り出しを
可能にするActiveSupport::Concernです。

ActiveSupport::Concernとは

ActiveSupport::Concernとは、MVC外部のconcernsというファイルに
メソッドを定義してMVCに呼び出すことで、
MVC側の記述量を減らし、またコードを共通化させることで
拡張性・メンテナンス性を向上させる為の機能です

実装例

例えば、controllerの場合は下記の様に利用します。

まず、controllersディレクトリ配下のconcernsに ファイルを作成します(名前は任意)

app/controllers/concerns/common.rb

module Common
  extend ActiveSupport::Concern

  def create_url(post)
    view_context.link_to post.title, post
  end
 end

これでメソッドの定義は完了です。 後は、このメソッドを利用したいコントローラーに 「include」という呼び出す為のコードを記述すれば設定完了です。

app/controllers/posts_controller.rb

class PostsController < ApplicationController
  include Common

  def create
    create_url(post)
  end