Service Object
ServiceObjectを導入するケース
- アクションが複雑になる場合 (決算期の終わりに帳簿をクローズする、など)
- アクションが複数のモデルにわたって動作する場合 (eコマースの購入でOrder, CreditCard, Customer を使用する、など)
- アクションから外部サービスとやりとりする場合 (SNSに投稿する、など)
- アクションが背後のモデルの中核をなすものではない場合 (一定期間ごとに古くなったデータを消去する、など)
class UserAuthenticator # メソッドを切り出す def authenticate(unencrypted_password) return @user if BCrypt::Password.new(@user.password_digest) == unencrypted_password end end
class SessionsController < ApplicationController def create user = User.where(email: params[:email]).first # UserAuthenticatorオブジェクトのビルドとメソッドの呼び出し UserAuthenticator.new(user).authenticate(params[:password]) end end
FormObjectとの違い
FormObject: 入出力がメインの処理
ServiceObject: ビジネスロジック