概要
Rails6でServiceを追加したい。
ServiceってのはModelやControllerに依存しない振る舞いの処理を記述したもので主に肥大化防止、保守性向上を目的に作ったりする。
結局はファイル追加するだけなんだけどつまづいたとこもあるのでメモ
Service追加
/app配下にservicesディレクトリを作ってファイルを配置する。試しにブログモジュールの記事サービスというのを追加してみる。
ディレクトリ構成は/app/services/blog/article_service.rb
module Blog
class ArticleService
・・・
end
end
Railsは定数自動読み込みの機能があるので基本的に追加しただけでクラスを認識できる
pry(main)> Blog::ArticleService
=> Blog::ArticleService
NameError: uninitialized constant
サーバ再起動したりreload!をしてもクラスを読み込めず
NameError: uninitialized constant
のエラーが出るときがある
Railsのautoload_pathを見てもサービスが出てこない
bin/rails runner 'pp ActiveSupport::Dependencies.autoload_paths'
・・・(servicesディレクトリなし)・・・
対策
springを止める。springってのは開発環境向けのプリローダとかいうやつでrailsコマンドを素早く起動できるもの。ファイルあるのに定数読み込みできない時はこいつが悪さしてたりする
以下で止める。
bin/spring stop
springはrailsコマンドを叩くと自動で再起動するらしい。これでもう一度autoload_pathを見ると今度はちゃんとservicesディレクトリが確認できる
bin/rails runner 'pp ActiveSupport::Dependencies.autoload_paths'
・・・
"/(アプリ名)/app/services"
pry(main)> Blog::ArticleService
=> Blog::ArticleService
0 件のコメント:
コメントを投稿