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^)ノ