0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ActiveSupport::Concernの解説してみた

Posted at

最近、実務をしていく中で、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の使い方
例えば、

hoge.rb
 puts 'hoge'
 puts 'fuga'
fuga.rb
 puts 'hoge'
 puts 'fuga'

この2つのファイルをみたとき、「あー、DRYじゃないなぁ」って思いませんか?
実際に書いてみると、下記のような書き方をします。

app/models/concerns/example_concern.rb
module Example
  extend ActiveSupport::Concern

  included do
    scope :hoge, -> {puts 'hoge'}
    scope :fuga, -> {puts 'fuga'}
  end
end

このように書くと、先ほどの、hoge.rbとfuga.rbは下記のように書けることができます。

hoge.rb
class Hoge < ApplicationRecord
  include Example
end
fuga.rb
class Fuga < ApplicationRecord
  include Example
end

こうすることで、コードの修正がしやすくなるなど、色々なメリットがあるのでconcernの使い道は多いです!

以上です。
何か間違いがございましたら、ご教示いただけますと幸いです。

【参考資料】

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?