最近、実務をしていく中で、ActiveSupport::Concernというものが現れて、よく分からなかったので、自分で調べて多くのことを学んだのでシェアしようとおもいます。
##ActiveSupport::Concernって何がいいの?
結論からいうと、
共通している処理をまとめることでDRY(Don't repeat yourself) にコードをかける
ことがメリットなんです。
具体的には、2個使い方があるとおもいます。
論より証拠、ということで実際にコードを見ていきましょう
##1個目の使い方
1つ目の使い方は、ルーティングを設定する際に使います。
例えば、以下のようなコードを見てください
concern :importable do
collection do
post 'import'
end
end
resources :admins do
concerns :importable
end
resources :users do
concerns :importable
end
=> /admins/import
=> /users/import
このように書くことによって、/importというURLがあるパスをスッキリと書くことができるんです。
もし、concernを使わずに書くとしたら、以下のような書き方になります。
resources :admins do
collection do
post 'import'
end
end
resources :users do
collection do
post 'import'
end
end
=> /admins/import
=> /users/import
今回は、collectionブロック内では、「post 'import'」しか指定していませんが、3つくらい指定していたら、行数が長くなるので、可読性がなくなってしまいます。
でも、concernをつかえば、スッキリ書くことができるんです。
これが1つ目のconcernを使うメリットです。
##2つ目のconcernの使い方
例えば、
puts 'hoge'
puts 'fuga'
puts 'hoge'
puts 'fuga'
この2つのファイルをみたとき、「あー、DRYじゃないなぁ」って思いませんか?
実際に書いてみると、下記のような書き方をします。
module Example
extend ActiveSupport::Concern
included do
scope :hoge, -> {puts 'hoge'}
scope :fuga, -> {puts 'fuga'}
end
end
このように書くと、先ほどの、hoge.rbとfuga.rbは下記のように書けることができます。
class Hoge < ApplicationRecord
include Example
end
class Fuga < ApplicationRecord
include Example
end
こうすることで、コードの修正がしやすくなるなど、色々なメリットがあるのでconcernの使い道は多いです!
以上です。
何か間違いがございましたら、ご教示いただけますと幸いです。
【参考資料】