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
Me
とYou
クラスで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^)ノ