Rubyにおけるサービスクラスの作り方で、一つ作り方を考えたので残しておきます。
サービスクラスとは複数のモデルを使ってビジネスロジックを記述を行うものです、ここでの詳細は割愛しますが、以下の記事が有名でとても勉強になります。
例として「AとBを行うHogeService」を作ります。
ソース
実際のソースがこんな感じ。
module HogeService def execute(hoge, fuga) a(hoge) b(fuga) end def a(hoge) puts "execute a action" end def b(fuga) puts "execute b action" end # ↓によってHogeService.executeの形で呼べる module_function :execute, :a, :b # プライベートメソッド化 private_class_method :a, :b end
よく見る例として module
ではなく class
内で以下のように定義しているものがあります。
class HogeService def self.execute(hoge, fuga) a(hoge) b(fuga) end end
これでも良いのですが new
でインスタンス作成できてしまったり self.execute
という形があまり好きじゃなかったりするのでmodule
を使って作成しました。
module
内で定義したメソッドはプライベートメソッドとして定義されるため他のクラスでincludeしないと使えませんが、 module_function
メソッドにメソッド名を渡すことで、そのメソッドがクラスの特異メソッドになります。要は execute
がクラスメソッドになって、外側から使えるようになります。
あとはコントローラー等から叩いてやればOKです。
class AnyController def create @any_value = HogeService.execute(params[:a], @account) end end