method
load_missing_constant
rails latest stable - Class:
ActiveSupport::Dependencies
Method deprecated or moved
This method is deprecated or moved on the latest stable version. The last existing version (v6.1.7.7) is shown here.
load_missing_constant(from_mod, const_name)public
Load the constant named const_name which is missing from from_mod. If it is not possible to load the constant into from_mod, try its parent module using const_missing.
# File activesupport/lib/active_support/dependencies.rb, line 540
def load_missing_constant(from_mod, const_name)
from_mod_name = real_mod_name(from_mod)
unless qualified_const_defined?(from_mod_name) && Inflector.constantize(from_mod_name).equal?(from_mod)
raise ArgumentError, "A copy of #{from_mod} has been removed from the module tree but is still active!"
end
qualified_name = qualified_name_for(from_mod, const_name)
path_suffix = qualified_name.underscore
file_path = search_for_file(path_suffix)
if file_path
expanded = File.expand_path(file_path)
expanded.delete_suffix!(".rb")
if loading.include?(expanded)
raise "Circular dependency detected while autoloading constant #{qualified_name}"
else
require_or_load(expanded, qualified_name)
if from_mod.const_defined?(const_name, false)
log("constant #{qualified_name} autoloaded from #{expanded}.rb")
return from_mod.const_get(const_name)
else
raise LoadError, "Unable to autoload constant #{qualified_name}, expected #{file_path} to define it"
end
end
elsif mod = autoload_module!(from_mod, const_name, qualified_name, path_suffix)
return mod
elsif (parent = from_mod.module_parent) && parent != from_mod &&
! from_mod.module_parents.any? { |p| p.const_defined?(const_name, false) }
# If our parents do not have a constant named +const_name+ then we are free
# to attempt to load upwards. If they do have such a constant, then this
# const_missing must be due to from_mod::const_name, which should not
# return constants from from_mod's parents.
begin
# Since Ruby does not pass the nesting at the point the unknown
# constant triggered the callback we cannot fully emulate constant
# name lookup and need to make a trade-off: we are going to assume
# that the nesting in the body of Foo::Bar is [Foo::Bar, Foo] even
# though it might not be. Counterexamples are
#
# class Foo::Bar
# Module.nesting # => [Foo::Bar]
# end
#
# or
#
# module M::N
# module S::T
# Module.nesting # => [S::T, M::N]
# end
# end
#
# for example.
return parent.const_missing(const_name)
rescue NameError => e
raise unless e.missing_name? qualified_name_for(parent, const_name)
end
end
name_error = uninitialized_constant(qualified_name, const_name, receiver: from_mod)
name_error.set_backtrace(caller.reject { |l| l.start_with? __FILE__ })
raise name_error
end Related methods
- Instance methods
- autoload_module!
- autoloadable_module?
- autoloaded?
- clear
- constantize
- depend_on
- hook!
- load?
- load_file
- load_missing_constant
- load_once_path?
- loadable_constants_for_path
- log
- mark_for_unload
- new_constants_in
- qualified_const_defined?
- qualified_name_for
- reference
- remove_constant
- remove_unloadable_constants!
- require_or_load
- safe_constantize
- search_for_file
- to_constant_name
- unhook!
- will_unload?
- Class methods
- load_interlock
- run_interlock
- unload_interlock
- Private methods
-
real_mod_name -
uninitialized_constant