讃岐小僧のEngineering×Techメモ

プログラミングや、趣味の野球、資産運用について、その他、ビジネスやテクノロジーをテーマに様々なことをつぶやく場所です。

【Rails】Controllerのリファクタリング

リファクタリングとは

リファクタリング (refactoring) とは、コンピュータプログラミングにおいて、プログラムの外部から見た動作を変えずにソースコードの内部構造を整理することである。

wiki~リファクタリング

なんのためにやるのか(小僧主観)

  • 他の人が見てもわかりやすくするため(見通しをよくする)
  • コードを再利用できるようにするため

Railにおける具体的なリファクタリング(Controller)

下記、よく見るControllerの記述。

app/controllers/products_controller.rb

class ProductsController < ApplicationController
  before_action :set_cart

  ~ ~ ~ 

  private

  def set_cart
    @cart = Cart.find_by(id: session[:cart_id])
    if @cart.nil?
      @cart = Cart.create
      session[:cart_id] = @cart.id
    end
  end
end

app/controllers/top_controller.rb

class TopController < ApplicationController
  before_action :set_cart

  ~ ~ ~ 

  private

  def set_cart
    @cart = Cart.find_by(id: session[:cart_id])
    if @cart.nil?
      @cart = Cart.create
      session[:cart_id] = @cart.id
    end
  end
end

上記2つのコントローラーでは全く同じset_cartというメソッドを定義していおり、どちらもインスランスにカートのインスタンスを差し込んでいる。

さらにset_cartは上記のインスタンス以外でも使用する可能性があるためできれば部品化しておきたい。

そんな時にはconcernsに処理を切り出すのが良さげ。

では早速リファクタリングする。

app/controllers/concerns/current_cart.rb ←これを新たに作る

module CurrentCart
  extend ActiveSupport::Concern

  private

  def set_cart
    @cart = Cart.find_by(id: session[:cart_id])
    if @cart.nil?
      @cart = Cart.create
      session[:cart_id] = @cart.id
    end
  end
end

公式レファレンス

見やすいと思ったところ

app/controllers/products_controller.rb

class ProductsController < ApplicationController
  include CurrentCart
  before_action :set_cart
end

app/controllers/top_controller.rb

class TopController < ApplicationController
  include CurrentCart
  before_action :set_cart
end

以上で共通化完了!