ControllerとViewの共通処理をConcernに書いた話
はじめに
Concernという存在を知ったので、まとめました。
Concernとは
どういうものなのか
Ruby on RailsのActiveSupport( 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にも、こういう風に書かないといけないのをこう出来るんだよ、という風に書いてあったのが後々なるほど、となったので、リンクを載せておきます。