autoload_paths
development 環境
- プロジェクトの
app
以下は自動的に読み込まれる。 - プロジェクト直下の
lib
はautoload_paths
に含まれない。
production 環境
- production 環境では
autoload
ではなくeager_load
が使われる。
設定
config/application.rb
にパスの設定を追加して、プロジェクトルートの lib
を development 環境で自動読み込み、production 環境で eagar_load
を行う。
config.paths.add "lib", eager_load: true
参考:
Rails5 の production 環境で lib/ 配下のクラス読込みが NameError になるのは autoload が無効化されたからだった – Qiita
Rails5 で lib 配下のクラス読み込みが NameError になる | ゼロイチ
Rails で lib 以下を読み込ませる方法とその注意点 〜名前重複の死を避けるために〜 – Qiita
Ruby on Rails で lib ディレクトリの自作クラスを使用する – Qiita
Rails4 で lib ディレクトリの自作ライブラリを autoload | EasyRamble
Rails4 で lib ディレクトリを autoload するときのルール | SHOYAN BLOG
定数の自動読み込みと再読み込み | Rails ガイド [公式]
Rails4 で lib ディレクトリの自作ライブラリを読み込めない – スタック・オーバーフロー
Rails autoloading — how it works, and when it doesn’t | urbanautomaton.com
The perils of Rails constant lookup | Jafrog’s dev blog
Auto-loading lib files in Rails 4 – Stack Overflow
Autoloading with custom folders not working – Stack Overflow
Adding a directory to the load path in Rails? – Stack Overflow
Override/Reopen a class within a Gem and the Rails initialization process – Stack Overflow
production 環境
production 環境では autoload
ではなく eager_load
が使われる。
参考:
production 環境での Autoload の廃止 – Qiita
Don’t forget about eager_load when extending autoload paths | Arkency Blog
Rails 5 Load lib files in production – Stack Overflow
自動読み込みに使われる autoload_paths
自動読み込みのパスを確認する。
puts ActiveSupport::Dependencies.autoload_paths
参考:
Rails の autoload_paths | kotaroito’s notes
autoload_paths – rails/dependencies.rb at v5.2.1 · rails/rails – GitHub
autoload_paths にディレクトリを追加する
自動読み込みのパスを追加する。
config.autoload_paths += %W[ #{config.root}/lib ]
autoload_paths
にパスを追加しても、production 環境では自動的に読み込まれないので注意。production 環境では eagar_load
用にパスを設定する必要がある。
参考:
Adding a directory to the load path in Rails? – Stack Overflow
Best way to load module/class from lib folder in Rails 3? – Stack Overflow
デフォルトの autoload_paths
Rails.application.config.paths
のデフォルト値がパスの設定を担っている。
def paths @paths ||= begin paths = Rails::Paths::Root.new(@root) paths.add "app", eager_load: true, glob: "{*,*/concerns}" paths.add "app/assets", glob: "*" paths.add "app/controllers", eager_load: true paths.add "app/channels", eager_load: true, glob: "**/*_channel.rb" paths.add "app/helpers", eager_load: true paths.add "app/models", eager_load: true paths.add "app/mailers", eager_load: true paths.add "app/views" paths.add "lib", load_path: true paths.add "lib/assets", glob: "*" paths.add "lib/tasks", glob: "**/*.rake" paths.add "config" paths.add "config/environments", glob: "#{Rails.env}.rb" paths.add "config/initializers", glob: "**/*.rb" paths.add "config/locales", glob: "*.{rb,yml}" paths.add "config/routes.rb" paths.add "db" paths.add "db/migrate" paths.add "db/seeds.rb" paths.add "vendor", load_path: true paths.add "vendor/assets", glob: "*" paths end end
参考:
Rails の autoload_paths | kotaroito’s notes
Rails の autoload_paths を設定しているソースの箇所 – Qiita
rails/configuration.rb at v5.2.0 · rails/rails – GitHub
rails/configuration.rb at v6.0.0.rc1 · rails/rails – GitHub
エンジンから autoload_paths を追加する
class MyEngine < Rails::Engine # Add a load path for this specific Engine config.autoload_paths << File.expand_path("lib/some/path", __dir__) end
参考:
Rails::Engine | Ruby on Rails API [Official]
How can I add autoload_paths in my Rails4 Engine? – Stack Overflow
config.paths
vendor/lib
を $LOAD_PATH
に追加する。
module MyApp class Application < Rails::Application # ... config.paths.tap do |paths| paths.add "vendor/lib", load_path: true end # ... end end
参考:
Rails の autoload_paths を設定しているソースの箇所 – Qiita
autoload_paths – Rails::Paths::Root | Ruby on Rails API [Official]
eager_load – Rails::Paths::Root | Ruby on Rails API [Official]
Rails::Paths::Root | Ruby on Rails API [Official]
Rails::Paths::Path | Ruby on Rails API [Official]
paths – rails/configuration.rb at v5.2.3 · rails/rails – GitHub
$LOAD_PATH / load_paths / set_load_path
load_paths
の設定を確認する
puts Rails.application.config.paths.load_paths
set_load_path
イニシャライザが、bootstrap_hook
より前に実行され、config.load_paths
及び全ての自動読み込みパスが $LOAD_PATH
に追加される。
参考:
Rails の風が吹いたら確認したい、Ruby のモジュールシステム | UUUM 攻殻機動隊
Ruby におけるライブラリロード | kotaroito’s notes
set_load_path – rails/engine.rb at v5.2.1 · rails/rails – GitHub
イニシャライザ – Rails アプリを設定する | Rails ガイド [公式]
普段特に何も考えずに使っていた require について調べてみた – Qiita
グローバル変数 $LOAD_PATH にパスを追加したい – teratail
Ruby のコマンドライン引数と環境変数について | DoRuby
Ruby におけるロードパス (require) の tips | Futurismo
$LOAD_PATH はファイルをロードするときのパス | rubyco るびこの日記
require がロードするファイルを探すパスに追加をする | make world
$LOAD_PATH と RUBY_LIB 変数の違いは何ですか? – teratail
Why to use $LOAD_PATH in Ruby? – Aayush Sharda – Medium
How to append a path to ruby’s LOAD_PATH in the context of rails? – Stack Overflow
Adding a directory to $LOAD_PATH (Ruby) – Stack Overflow
concerns のパス
参考:
engine concerns autoload paths – Stack Overflow
NameError (uninitialized constant エラー)
定数の自動読み込みに失敗した場合に発生するエラー
NameError: uninitialized constant ...
名前エラー:自動読み込みの命名規則に一致するファイルが見つからなかった。
参考:
config.autoload_paths not working, unable to include modules in rails 4 – Stack Overflow
LoadError
定数の自動読み込みに失敗した場合に発生するエラー
LoadError: Unable to autoload constant ... expected ... to define it
読み込みエラー:自動読み込みの命名規則に一致するファイルが見つかったが、そのファイル内で定数が定義されていない。
参考: