🐙
RailsのAuto LoadのName Error
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を実現しています。
今回は自動読み込みのみの記事です。
Auto Loadで読み込まれるディレクトリ
デフォルトでアプリケーション起動時にapp
下のディレクトリ(assets, javascript, views 以外)にとアプリケーションが依存する可能性があるエンジンの自動読み込みパスを読み込みます。
デフォルトではlib
ディレクトリなどは読み込みません。
読み込みパスを追加するにはconfig/application.rb
でconfig.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で設定を認知していない場合があるのでハマりそうな所です。
Discussion