【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

以上で共通化完了!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です