LoginSignup
1
2

Railsのコントローラー(モデルでも)では他とメソッドを共有したい時に継承ではなくConcernsを使おう

Last updated at Posted at 2020-04-15

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

そうすることで、改修の際に継承されていることに気が付かずバグるというリスクが下がります。

1
2
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
1
2