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

広告

[書籍] ティムクック アップルをさらなる高みへと押し上げた天才 感想まとめ

   こういう人におすすめ ティムクックのことを知らないという人 アップル、ジョブズのファン 概要 2011年 ティムクック がAppleのCEOを引き継ぎました。 クック の知名度は低く、批評家たちは ジョブズ なしではAppleは終わりを迎えるだろうと危惧していました。 しか...

QooQ