・サービスクラスとは
コントローラー内のコードの可読性を高めるために用いる概念で、モデルとは別に処理を記述するファイルのこと。
・サービスクラスを使用する目的
モデルの記述は肥大化しやすいため、複雑な処理はサービスクラスに切り出すことで可読性を保つことができる。
・サービスクラスの使用方法
例えばすでに下記のようにモデル内に記述している処理をサービスクラスに切り出そうとするときを例にあげて説明する。
ruby app/models/モデル名.rb
class モデル名 < ApplicationRecord
validates :text, presence: true
belongs_to :user
has_many :comments
def self.search(search)
if search != ""
Tweet.where('text LIKE(?)', "%#{search}%")
else
Tweet.all
end
end
end
1.サービスクラスを定義する
まずは以下のような配置になるように必要なディレクトリとファイルを作成する。
app
L sevices
L search_tweets_service.rb # 好きな名前
2.作成したファイルに処理を記述する
ruby search_tweets_service.rb
class SearchTweetsService
def self.search(search)
if search != ""
Tweet.where('text LIKE(?)', "%#{search}%")
else
Tweet.all
end
end
end
SearchTweetsServiceというクラスを定義した後は、すでにモデルに記述していた処理をそのまま書くだけで終わり。
3.コントローラーで呼び出し
ruby controllers/コントローラー名.rb
class コントローラー名 < ApplicationController
~省略~
def search
@tweets = SearchTweetsService.search(params[:keyword])
end
~省略~
end
モデルに書いていた時の呼び出しは以下
ruby コントローラー名.rb
def search
@tweets = Tweet.search(params[:keyword])
end
比べるとクラス名が違うだけで記述は一緒です。
読みにくくなりそうな複雑な処理は最初からサービスクラスを使って読みやすることが大切。
また、メンテナンス時のことを考えるとサービスクラスを使用していた方がわかりやすい。