autoload_paths

development 環境

  • プロジェクトの app 以下は自動的に読み込まれる。
  • プロジェクト直下の libautoload_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

autoload_paths の誤解 – Qiita

Ruby on Rails で lib ディレクトリの自作クラスを使用する – Qiita

Rails でのモジュールのオートロード – 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

Understanding ruby load, require, gems, bundler and rails autoloading from the bottom up – cstack – Medium

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

variable $-I (Ruby 2.5.0)

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

読み込みエラー自動読み込みの命名規則に一致するファイルが見つかったが、そのファイル内で定数が定義されていない。

参考:

LoadError: Unable to autoload constant|teratail

Rails console: Unable to autoload constant – Stack Overflow

記事をシェアする:
タグ:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Protected by reCAPTCHA