🐙

RailsのAuto LoadのName Error

2024/08/17に公開

RailsのAuto Loadとは

通常のRubyであれば他のクラス、モジュールを使いたい場合明示って気にインポートする必要があります。

require "application_controller"
require "post"

class PostsController < ApplicationController
  def index
    @posts = Post.all
  end
end

Railsは明示的にrequireでインポートせずともどこでも利用できます。

class PostsController < ApplicationController
  def index
    @posts = Post.all
  end
end

RailsはZeitwerkというものを使い自動読み込み、再読み込み、eager loadingを実現しています。
今回は自動読み込みのみの記事です。

https://github.com/fxn/zeitwerk

Auto Loadで読み込まれるディレクトリ

デフォルトでアプリケーション起動時にapp下のディレクトリ(assets, javascript, views 以外)にとアプリケーションが依存する可能性があるエンジンの自動読み込みパスを読み込みます。
デフォルトではlibディレクトリなどは読み込みません。
読み込みパスを追加するにはconfig/application.rbconfig.autoload_pathsに追加します。

module MyApplication
  class Application < Rails::Application
    config.autoload_paths << "#{root}/extras"
  end
end

LibのAuto Load

/libのオートロードはデフォルトに含まれていないので明示的に追加する必要があります。
しかしオートロードをしたくないディレクトリが配下にある場合もあります。
下記のような設定行うことでAuto Loadから除外できます。

config.autoload_lib(ignore: %w(assets tasks))

Auto LoadのName Error

Railsを実行するときにAuto Loadで設定されているディレクトリのファイルはすべて読み込まれるので、誤って開発環境のみで使うようなカスタムcopなどのファイルを配置してしまうとNameError: uninitialized constantのような未定義のエラーがでます。
libや他のディレクトリがAutoLoadで設定を認知していない場合があるのでハマりそうな所です。

GitHubで編集を提案
SMARTCAMP Engineer Blog

Discussion