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: ビジネスロジック

引用文献

techracho.bpsinc.jp