railsアプリにてserviceクラスの読み込みでNameError (uninitialized constantrails クラス名)

rails

railsアプリで、ファットモデル・コントローラ解消のため、serviceクラスを使おうと思っていたところ、表題エラーが発生しました。

本記事では問題が発生した理由と解決方法について解説していきます。

serviceクラスの配置や呼び出し方法について

serviceクラスには下記のようなクラスメソッドを作成。

class Test
  def test_method
    put "test"
  end
end

呼び出しもとは、controllerで、下記のように記述

class UsersController < ApplicationController
  def index
    ::Test.test_method
  end
end

上記のindexアクションを呼び出すと

NameError (uninitialized constant Test):

となる。

Testクラスが見つからないという問題のようだが、一般的な命名エラーの原因である、呼び出し側の命名の間違いや、class名とファイル名が違うなどの問題もない。

解決策

解決は単純でした。

サーバーを立ち上げ直すことでクラスが読み込まれるようになりました。

NameError (uninitialized constantrails クラス名)が発生した原因

railsでは、autoload機能があり基本的にはファイルを追加すると勝手に呼び込んでくれるみたいですが、ディレクトリの読み込みはconfigで行っているため、サーバーを立ち上げた後にディレクトリを作成しても読み込んでくれないのではないかと思っています。

そのため立ち上げ直すと、config.autoload~が実行され、ディレクトリの存在を認識するのでは?と思いました。(あくまで仮定ですが…)

まとめ

基本的に、NameError (uninitialized constantrails クラス名)は、呼び出し元のクラスを間違えているか、ファイルに記載されているクラス名がディレクトリ構造・ファイル名と合っていないことが多いです。

ただし、今回のようにdockerなどでサーバー立ち上げ後にserviceディレクトリなど追加した場合は、ディレクトリが読み込まれていない可能性があるため、サーバーの立ち上げ直しを行ってみてください。

コメント

タイトルとURLをコピーしました