Railsのconcernにはロジックを書くのはやめよう

みなさんはRailsのconcernは使ってますか?

僕はあまり使いませんが、何気に書いたコードがちょっとまずかったのでブログに書いてみます

やってしまったことは、concernにビジネスロジックを書きなぐってました

これ、なぜダメだと思ったというと、オーバーライドができない!(やりずらい)

サンプルコードはこんな感じです

module Hello
  extend ActiveSupport::Concern

  def say
    puts 'Hello'
  end
end

class Me
   include Hello
end

class You
  include Hello
end

MeYouクラスでHelloモジュールをmix-inしてます

Railsのアプリで使うなら、sayメソッドの振る舞いを変えることができます

ただ、このコードがgemだったらどうでしょうか?

アプリ側でsayメソッドの振る舞いを変更したい場合...

Me, Youそれぞれにsayメソッドを書かかないと変更できなくなります!

module Hello
  extend ActiveSupport::Concern

  def say
    puts 'Hello'
  end
end

class Me
   include Hello

  def say
    puts 'Say Hello'
  end
end

class You
  include Hello

  def say
    puts 'Say Hello'
  end
end

ダメダメですね...

では、どうすればいいのか?

ロジックをクラスに押し込むことで解決できます

class Greeting
  def hello
    puts 'Hello'
  end
end

module Hello
  extend ActiveSupport::Concern

  def say
    Greeting.new.hello
  end
end

class Me
   include Hello
end

class You
  include Hello
end

これならGreetingクラスのhelloメソッドをprependなどで振る舞いを変えることができるようになりますね

Enjoy Railsヘ(^o^)ノ