コントローラーのリファクタリング #ruby #rails

今回はコントローラーのリファクタリングについてメモを残したいと思います

ruby on rails でコントローラーにコードを記述していって気づくとコントローラー内のコードの量がパンパンになってなぜこんなに長くなってしまったんだ( ;∀;)

という事が起きてしまう人も中にはいるのではないかと思います。そのうちの1人が私です

今回はコントローラーのリファクタリングについて大きく2つの方法を紹介したいと思います

①複数のコントローラに同じ処理が記述されている場合

 

app/controllers/concerns/○○.rb(任意の名前)ファイルを追加し、moduleを設定したのち必要な箇所で読み込ませる

具体的には以下のように記述します

module TyoufukuRefactoring
  extend ActiveSupport::Concern

  private

  def syorinaiyou
    //中身記述
  end
end

そしてコントローラーないでは

class MainsController < ApplicationController
  include TyoufukuRefactoring
  before_action :syorinaiyou
end

こうする事で複数コントローラーにある記述を省略して記述できるようになります

 

親コントローラにメソッドを定義する

単純な話にはなりますが親コントローラーに共通の内容を記述する方法です

共通の親がApplicationControllerだった場合

app/controllers/application_controller.rbの中を以下のように記述するだけです

def ApplicationController < ActionController::Base

 //共通の内容を記述
end

 

②コントローラに複雑な処理を記述している場合

記述内容をモデルに移します

こちらも方法はシンプルでコントローラーに以下のように記述します

@products = Sorting.sorting_products(order_id)

上はサンプルですがイコールの右辺が読み込みに行くコントローラーの名前になっています モデル自体は以下がサンプルで

class Sorting
 def self.sorting_products(order_id)
  //処理内容記述
 end
end

とすることでモデルに処理内容を読み込みにいき結果を受け取る事ができます

※もし実行時にコントローラーでモデルが見つからないという趣旨のエラーが発生する時は、

require "sorting.rb"

を記述してあげる事で読み込めるようになる事も有ります

(読み込める時と読み込めない時の違いははっきりわかっていませんご存知の方がおられましたら教えて頂けると幸いです)

以上大きく2つ紹介しましたが参考にして頂けたら幸いです!!