ActiveSupport::Concern

参考:

ActiveSupport::Concern の存在理由 – Qiita

ActiveSupport::Concern とは – Qiita

ActiveSupport::Concern でハッピーなモジュールライフを送る|  TECHSCORE BLOG

Model (Active Record) の Concern | 酒と涙とRubyとRailsと

ActiveSupport::Concern | Ruby on Rails API [Official]

rails/concern.rb at 5-2-stable · rails/rails – GitHub

使い方

参考:

共通部分を切り出す (View, Controller, Model) メモ – Qiita

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

Rails で concerns を使えば、application_controller.rb を汚さずに共通化できる | 経理からエンジニア転向した人のメモ

How to use concerns in Rails 4 – Stack Overflow

class_methods / ClassMethods

参考:

Rails 4.2 からは module ClassMethods ではなく Concern#class_methods を使おう | yuji.developer’s graffiti blog

Rails の module ClassMethods がやっている事 – Qiita

included ブロック

モジュールが include された時に、対象のモジュール (もしくはクラス) をレシーバーとして class_eval で評価されるブロックを定義する。

module M
  extend ActiveSupport::Concern
  this = self
  included do |base|
    puts "#{this} is included in #{base}"
    puts "#{self} is #{base}"
  end
end

class A; end
A.include M
# prints:
#   M is included in A
#   A is A

参考:

included – ActiveSupport::Concern | Ruby on Rails API [Official]

included do end block – Stack Overflow

scope を定義する

参考:

scope を ActiveSupport::Concern に分割する – Qiita

Concerns に切り出した module のなかで ActiveRecord の Scope を使う方法 – Qiita

Shared scopes via module? – Stack Overflow

attr_accessor をオーバーライドする

参考:

How do I override an attr_accessor getter from a module? – Stack Overflow

prepend に対応させる

参考:

prepend されたときにクラスメソッドとインスタンスメソッドを同時に追加するパターン | ttanimichi’s blog

concern.rb – GitHub Gist

ActiveSupport::Concern support Module#prepend? – Google グループ

複数の included ブロック定義

複数の included ブロックを定義するとエラーが発生する。

Cannot define multiple 'included' blocks for a Concern

参考:

Do nothing when the same block is included again by mjtko · Pull Request #34553 · rails/rails – GitHub

Raise only when different included blocks are defined by razum2um · Pull Request #14802 · rails/rails – GitHub

ActiveSupport::Concern and Rails.config.cache_classes · Issue #15767 · rails/rails – GitHub

Cannot define multiple ‘included’ blocks for a Concern (ActiveSupport::Concern::MultipleIncludedBlocks) with cache_classes = true – Stack Overflow

タグ:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です