Rails 7.1 adds the ability to autoload the lib directory
The lib directory in a Rails application is used for storing custom modules,
utility classes,
and
other reusable code that doesn't belong in the standard application directories like app
,
config
,
or
test
.
Prior to Rails 7.1,
the lib
directory was not automatically included in the autoload paths.
Hence,
you need to explicitly require any classes
or
modules defined in this directory before you can use them.
Before Rails 7.1
To autoload files from the lib
directory in Rails versions before 7.1,
use the eager_load_paths
or
autoload_paths
configuration setting.
This setting allows you to specify a list of directories that Rails should eagerly load,
which will be loaded before the application boots up.
To use eager_load_paths
or
autoload_paths
,
add the following line to your config/application.rb
file:
# config/application.rb
config.autoload_paths << Rails.root.join('lib')
# or
config.eager_load_paths << Rails.root.join('lib')
If you want to ignore a few subdirectories,
use the Rails.autoloaders.main.ignore
method.
Let's say you have generators
,
assets
,
and
tasks
under the lib
directory;
you can exclude these from autoloading as below:
# config/application.rb
["generators", "assets", "tasks"].each do |subdirectory|
Rails.autoloaders.main.ignore("#{Rails.root}/lib/#{subdirectory}")
end
In Rails 7.1
In Rails 7.1,
a new configuration method was called
config.autoload_lib
is introduced,
simplifying the autoloading files from the lib
directory.
This method takes an optional ignore:
argument,
which allows you to specify specific subdirectories within the lib
directory
that should not be autoloaded.
To enable autoloading for the entire lib
directory,
you can add the following line to your config/application.rb
file:
config.autoload_lib
If you want to exclude certain subdirectories from autoloading,
you can specify them using the ignore:
option:
config.autoload_lib(ignore: %w[tasks assets])
This will prevent Rails from autoloading files from the
tasks
and
assets
subdirectories within the lib
directory.
The config.autoload_lib
method provides a more convenient
and
flexible way to manage autoloading for the lib
directory,
making it easier to keep your code organized
and
maintainable.
To know more about this feature, please refer to this PR.