Rails Service追加したらNameError: uninitialized constant

2022年2月8日火曜日

Rails Ruby

t f B! P L

  

概要

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

自己紹介

Webエンジニアをやっています。日々思ったことや、読書レビュー、IT系の記事などを書き連ねています

広告

Rails Service追加したらNameError: uninitialized constant

   概要 Rails6でServiceを追加したい。 ServiceってのはModelやControllerに依存しない振る舞いの処理を記述したもので主に肥大化防止、保守性向上を目的に作ったりする。 結局はファイル追加するだけなんだけどつまづいたとこもあるのでメモ Servic...

QooQ