Railsでサービスクラスを作ってみた

やりたいこと

Railsのディレクトリ構成でservicesディレクトリを作成し、controllerのロジックをサービスクラスに任せたい

 

今回のルール

今回のサービスクラスのルールは先人たちの知恵をお借りして以下のルールにしました。

  • publicなメソッドはクラス内で1つにする。(callメソッドのみ)
  • インスタンス変数はattr_readerで外部から呼び出し可能にする
  • 使用する際はnewでインスタンス化し、callメソッドに引数を渡す

https://qiita.com/chrischris0801/items/58a12d17a440b842db02

https://github.com/mastodon/mastodon/tree/main/app/services

 

実装

今回は、予定管理サービスのユーザーが持っている予定一覧を取得するロジックをイメージしてください。

サービスクラス

app/services/user_plan_search_service.rb

class UserPlanSearchService
 attr_reader :user ・・・①

 def call(user_id) ・・・②
  @user_id = user_id
  search_plan @user_id
 end

 private

 def search_plan(user_id)
  Plan.where(user_id: user_id).where('start_time > ?', Date.today)
 end
end
① ルールの2つ目の部分になります
② ルールの1つ目の部分になります

コントローラークラス

コントローラークラスでの使われ方になります。

app/controllers/users_controller.rb

@plans = UserPlanSearchService.new.call(params[:id])

ルールの3つ目になります。

 

これで今回のサービスクラスは完成です。

実際に使いやすかなどはもう少し検討してみようと思います。

 

以上!!!!!!!