Railsのconcernsについて

2014-07-21T00:00:00+00:00 Ruby Rails

モデルやらコントローラーでmixinすることで定義を分割するような仕組みみたいなのらしい。要はコントローラーやらモデルやらにずらーっと定義しなくてもconcernsに定義をする事でinlcudeして利用できる

共通性があるような処理等においてはconcerns内のモジュールでメソッドを定義し利用する側でincludeするだけ

app/models/entry.rb

class Entry < ActiveRecord::Base
  include Hoge
end

Hogeをincludeしているので、app/models/concerns/hoge.rbを作る

app/models/concerns/hoge.rb

module Hoge
  extend ActiveSupport::Concern

  included do |base|
    base.extend ClassMethods
  end

  module ClassMethods
    def one
      find(1)
    end
  end
end

っていう感じでinclude元に対してメソッド生やしたりとか出来るっていう感じかと

test/models/entry_test.rb

require "test_helper"

class EntryTest < ActiveSupport::TestCase
  test "the truth" do
    entry = Entry.one
    assert_not_nil entry
    assert_equal entry.id, 1
  end
end

上記でEntryクラスでinclude HogeしてHogeでoneメソッド(クラスメソッド)を生やしてるのでEntry.oneで結果が返ってきてそれを検証している感じ

てな感じだけど、コントローラー(app/controllers)にもconcernsディレクトリがあるのでコントローラーも同様みたいな事すれば良いだけっぽい。

以上。concernsを使う事に関しては色々な見解がある模様だし調べてみてもあんまり採用しているようなケースを見受けられないけど、まぁそういう物だよっていう知識として持ってても良いかと

余談: concerningについて

参考: Rails 4.1.0 で追加された Module#concerning と関心事の分離

directiveのmultiElement ng-directiveのscope