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つ目になります。
これで今回のサービスクラスは完成です。
実際に使いやすかなどはもう少し検討してみようと思います。
以上!!!!!!!