railsでプログラミングをしていると、同じようなメソッドを別々のコントローラーで使いたい時があったりします。また、肥大化して可読性がさがったコードを分割して、別ファイルにしたい時とかもあります。そんなときは継承を使わずに、Concernsを使いましょう
継承を使うと、改修が起きた時にバグに気が付かない
例えば、HogeController
からCSV出力の所だけ切り出したHogeCsVController
を作りたい場合
HogeController.rb
class HogeController < ApplicationController
def index
end
def show
end
protected
def set_hoge
end
end
HogeCsvConntroller.rb
class HogeCsvController < HogeController
def csv
hoge = set_hoge
end
end
みたいな書き方でも動くといえば動きます。が、HogeController
側に改修が入れる際、わざわざset_hogeメソッドが他のCSV用のコントローラーに影響があるなんて意識しないでしょう。で、気が付かずset_hogeメソッドをいじった結果、CSVがバグっているのに気が付かない…なんてことが発生します。
Concernsを使って明示的に「共通の物」としておく
こんな感じで書きましょう。
app/controllers/concerns/hoge_article.rb
module HogeArticle
extend ActiveSupport::Concern
def set_hoge
end
end
HogeController.rb
class HogeController < ApplicationController
include HogeArticle
def index
end
def show
end
end
HogeCsvConntroller.rb
class HogeCsVController < ApplicationController
include HogeArticle
def csv
hoge = set_hoge
end
end
そうすることで、改修の際に継承されていることに気が付かずバグるというリスクが下がります。