diff --git a/railties/CHANGELOG.md b/railties/CHANGELOG.md index 8b8956a6b3bcd..f26546b5e4b40 100644 --- a/railties/CHANGELOG.md +++ b/railties/CHANGELOG.md @@ -1,3 +1,9 @@ +## Unreleased + +* Fix a regression in which autoload paths were initialized too late. + + *Xavier Noria* + ## Rails 7.0.0.alpha2 (September 15, 2021) ## * Fix activestorage dependency in the npm package. diff --git a/railties/lib/rails/application/bootstrap.rb b/railties/lib/rails/application/bootstrap.rb index 6791992dacf82..44ccef5cea4cf 100644 --- a/railties/lib/rails/application/bootstrap.rb +++ b/railties/lib/rails/application/bootstrap.rb @@ -66,7 +66,7 @@ module Bootstrap # We setup the once autoloader this early so that engines and applications # are able to autoload from these paths during initialization. - initializer :setup_once_autoloader do + initializer :setup_once_autoloader, after: :set_eager_load_paths, before: :bootstrap_hook do autoloader = Rails.autoloaders.once ActiveSupport::Dependencies.autoload_once_paths.freeze diff --git a/railties/lib/rails/engine.rb b/railties/lib/rails/engine.rb index ce3f745539e2e..1849638323f37 100644 --- a/railties/lib/rails/engine.rb +++ b/railties/lib/rails/engine.rb @@ -570,14 +570,12 @@ def load_seed $LOAD_PATH.uniq! end - initializer :set_autoload_once_paths, before: :setup_once_autoloader do - config.autoload_once_paths.freeze + initializer :set_autoload_paths, before: :bootstrap_hook do + ActiveSupport::Dependencies.autoload_paths.unshift(*_all_autoload_paths) ActiveSupport::Dependencies.autoload_once_paths.unshift(*_all_autoload_once_paths) - end - initializer :set_autoload_paths, before: :setup_main_autoloader do config.autoload_paths.freeze - ActiveSupport::Dependencies.autoload_paths.unshift(*_all_autoload_paths) + config.autoload_once_paths.freeze end initializer :set_eager_load_paths, before: :bootstrap_hook do diff --git a/railties/test/railties/engine_test.rb b/railties/test/railties/engine_test.rb index 42b956b7c831d..432eed4e67f1e 100644 --- a/railties/test/railties/engine_test.rb +++ b/railties/test/railties/engine_test.rb @@ -233,6 +233,26 @@ class AddFirstNameToUsers < ActiveRecord::Migration::Current assert_equal "Another", Another.name end + test "when the bootstrap hook runs, autoload paths are set" do + $test_autoload_once_paths = [] + $test_autoload_paths = [] + + add_to_config <<~RUBY + # Unrealistic configuration, but keeps the test simple. + config.autoload_once_paths << "#{app_path}/app/helpers" + + initializer "inspect autoload paths", after: :bootstrap_hook do + $test_autoload_once_paths += ActiveSupport::Dependencies.autoload_once_paths + $test_autoload_paths += ActiveSupport::Dependencies.autoload_paths + end + RUBY + + boot_rails + + assert_includes $test_autoload_once_paths, "#{app_path}/app/helpers" + assert_includes $test_autoload_paths, "#{app_path}/app/controllers" + end + test "puts its models directory on autoload path" do @plugin.write "app/models/my_bukkit.rb", "class MyBukkit ; end" boot_rails