Rubyと仲良くなりたい٩( 'ω' )و

Rubyと仲良くなりたい日々のこと

ControllerとViewの共通処理をConcernに書いた話

はじめに

Concernという存在を知ったので、まとめました。

Concernとは

どういうものなのか

Ruby on RailsActiveSupport( Active Support Core Extensions )の一つです。

モジュールを利用してMix-inする時に、複雑なコードを書かなくていいようにしてくれて、モジュールの依存関係もいい感じに処理してくれる機能です。

Active Supportについて

Active Supportは、Ruby言語の拡張、ユーティリティ、その他横断的な機能を提供するRialsのコンポーネントです。

Ruby on Railsアプリケーションでは、(config で読み込まない設定をしていない限り)基本的にすべてのActive Supportを読み込みます。

どんな時に使われるのか

主には、MVCをまたいで共通した処理を利用したい場合に用いられます。 例えば、Viewでも使いたいけど、Controllerでも使いたいメソッドがある場合、
Viewだけならhelperに書けば良いし、ControllerだけならApplicationControllerに書けば良いのですが、
どちらでも使いたい場合、共通のモジュールとしてConcernに定義することが考えられます。

具体例

ViewでもControllerでも使いたいhugaというメソッドがある時の一例です。
helper methodとして使えるようにしています。

Concern

app/controllers/concerns/hoge.rb

# Hogeというmoduleを定義
module Hoge
  # ActiveSupportのConcernを取り込む
  extend ActiveSupport::Concern
  
  # includedに渡したブロックがmoduleのinclude先で利用出来るようにする
  included do
    # helper_methodにhugaを渡す
    helper_method :huga
  end
  
  # hugaメソッドを定義
  def huga
    @huga_huga = xxxxxxxxxxxx
  end
end

Controller

app/controllers/xxxx_controller.rb

class ApplicationController < ActionController::Base
  # Hogeモジュールを取り込む
  include Hoge
end

View

app/views/xxxx/index_html.haml

%p "#{@huga_huga}さん"

最後に

色々な歴史があってActive Supportに追加されたので、調べてみると古いコード例などもあり、どう書けば良いものか悩みました。
Ruby on Rails 5.2.0にも、こういう風に書かないといけないのをこう出来るんだよ、という風に書いてあったのが後々なるほど、となったので、リンクを載せておきます。

api.rubyonrails.org