kikeda1104's blog

備忘録・技術に関することを書いています。(webエンジニア)

サービス層の導入

業務で、サービスクラスをmodelsに入れていたので、そのファイルの移動と自作でサービス層を追加しました。

serviceクラス

Modelに書くにはコードの量が多い機能で、Fat modelになる恐れがあり、concernに移す事も考えましたが、共通で利用することもないため サービス層にロジックを移すことにしました。

ファイルの設置

app下に、ファイルを作ります。

app/services/select_info_service.rb

class SelectInfoService
  def initialize(info)
    @title = info[:title]
    @body = info[:body]
  end

  def search
    ...
  end

  private
  attr_accessor :title、:body
end

autoload_pathに追加

  # config/application.rb
  config_autoload_path += "#{config.root}/app/services/**/*.rb"

Rails 5では、config/initialize/..にファイルを作成すること推奨しています。

./bin/rails c

si = SelectInfoService.new
si.search

module化して、/libに置くか。共通処理であれば、controllers/concerns または、 models/concernsに置くか。迷うが、割とappの下にファイルを設置することが多く、それに見習った。

参考

Railsでサービスとフォームを導入してみる話 - assertInstanceOf('Engineer', $a_suenami)