RailsでActiveSupport::Concernを使って、複数のコントローラで共通のモジュールを使う方法

大掛かりなRailsプロジェクトになってくると、コントローラクラスも増加し、共通のメソッドを異なるコントーラで利用したいという事態にしばしば出会う。Rubyでは、その共通するメソッドをモジュールに記述し、クラス内でincludeするMix-inという処理を切り出す機能が存在する。加えてRails 4(5は未確認)では、そのモジュールを配置する所定のディレクトリが決められており、そこに正しいネーミングで共通モジュールを格納すると、各コントローラクラスでrequireする必要なしに、モジュールメソッドを利用できる。

モジュールを配置する所定のディレクトリ、およびモジュールのファイル名は以下の通り。

  • ディレクトリ – app/controllers/concerns
  • ファイル名 – コントローラクラスのファイルと同じ命名規則に従い、モジュール名がMyUtilityの場合、そのファイル名はmy_utility.rb

モジュール my_utility.rb

module MyUtility
    extend ActiveSupport::Concern # インスタンスメソッドのみの利用時は記述の必要なし
    
    # privateより上に記述したメソッドはコントローラクラスでコール可能
    def sample
       …
    end
    
    # 以下モジュール内でのみ参照可能
    private
    def internal_method
       … 
    end
end

ActiveSupport::Concernは、共通モジュールを記述する際の手続きを省略してくれるモジュール。きっとw

共通モジュールの中身がインスタンスメソッドだけならば、extend ActiveSupport::Concernは不要。

モジュールをincludeするコントローラクラス

class SampleController < ApplicationController
    include MyUtility
    
    def index
        sample # モジュールメソッドをコール
    end
end

以上、これでapp/controllerディレクトリがすっきりし、かつ共通モジュールを一つのディレクトリにまとめることができます。

以下、参考にした技術書です。とにかく載ってることが多い!これと下の参考書の2冊を読めば、大概のRailsアプリは組めると思います。

基礎からガッツリやりたい方はまずこちらからやるのがおすすめ。一つのRailsアプリをこの一冊で書き上げる形のもので、とにかくわかりやすいです。

コメントを残す

メールアドレスが公開されることはありません。