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系の記事などを書き連ねています

広告

[書籍] 世界一楽しい決算書の読み方感想まとめ

  こういう人におすすめ 決算書を読もうとして挫折した人 企業分析したい投資家 会社で経営企画担当、管理職などのポジションの人 概要 著者はTwitterで会計クイズを行なっている 「大手町のランダムウォーカー」さん 。 「日本人全員が財務諸表を読める世界を創る」 を合言葉にして...

QooQ