Notice how a class that is not available is a NameError and a constant 
unloaded from ActiveSupport::Dependencies or via remove_const called on the 
module is a RuntimeError about a circular dependency...

The class I unloaded has no references to or from anywhere else.

Just to show how a missing constant behaves normally:

Loading development environment (Rails 4.0.2)
2.1.0 :001 > Nothing::Nothing.to_s
NameError: uninitialized constant Nothing
  from (irb):1
  from /path/to/gemset/railties-4.0.2/lib/rails/commands/console.rb:90:in 
`start'
  from /path/to/gemset/railties-4.0.2/lib/rails/commands/console.rb:9:in 
`start'
  from /path/to/gemset/railties-4.0.2/lib/rails/commands.rb:62:in `<top 
(required)>'
  from bin/rails:4:in `require'
  from bin/rails:4:in `<main>'

Now, how a missing constant behaves after being undefined by Rails 4.0.2:

2.1.0 :002 > Object.const_defined? 'MyModule::MyClass'
 => false 
2.1.0 :003 > MyModule::MyClass.to_s
 => "MyModule::MyClass" 
2.1.0 :004 > Object.const_defined? 'MyModule::MyClass'
 => true 
2.1.0 :005 > ActiveSupport::Dependencies.remove_constant MyModule::MyClass
 => MyModule::MyClass 
2.1.0 :006 > Object.const_defined? 'MyModule::MyClass'
 => false 
2.1.0 :007 > MyModule::MyClass.to_s
RuntimeError: Circular dependency detected while autoloading constant 
MyModule::MyClass
  from 
/path/to/gemset/activesupport-4.0.2/lib/active_support/dependencies.rb:461:in 
`load_missing_constant'
  from 
/path/to/gemset/activesupport-4.0.2/lib/active_support/dependencies.rb:184:in 
`const_missing'
  from (irb):7
  from /path/to/gemset/railties-4.0.2/lib/rails/commands/console.rb:90:in 
`start'
  from /path/to/gemset/railties-4.0.2/lib/rails/commands/console.rb:9:in 
`start'
  from /path/to/gemset/railties-4.0.2/lib/rails/commands.rb:62:in `<top 
(required)>'
  from bin/rails:4:in `require'
  from bin/rails:4:in `<main>'
2.1.0 :008 > load 
"#{Rails.root}/app/an_autoloaded_dir/my_module/my_class.rb"
 => true 
2.1.0 :009 > MyModule::MyClass.to_s
 => "MyModule::MyClass" 
2.1.0 :010 > MyModule.send(:remove_const, :MyClass)
 => MyModule::MyClass 
2.1.0 :011 > Object.const_defined? 'MyModule::MyClass'
 => false 
2.1.0 :012 > MyModule::MyClass.to_s
RuntimeError: Circular dependency detected while autoloading constant 
MyModule::MyClass
  from 
/path/to/gemset/activesupport-4.0.2/lib/active_support/dependencies.rb:461:in 
`load_missing_constant'
  from 
/path/to/gemset/activesupport-4.0.2/lib/active_support/dependencies.rb:184:in 
`const_missing'
  from (irb):23
  from /path/to/gemset/railties-4.0.2/lib/rails/commands/console.rb:90:in 
`start'
  from /path/to/gemset/railties-4.0.2/lib/rails/commands/console.rb:9:in 
`start'
  from /path/to/gemset/railties-4.0.2/lib/rails/commands.rb:62:in `<top 
(required)>'
  from bin/rails:4:in `require'
  from bin/rails:4:in `<main>'
2.1.0 :013 > load "#{Rails.root}/app/workflow/my_module/my_class.rb"
 => true 
2.1.0 :015 > MyModule::MyClass.to_s
NameError: uninitialized constant MyModule
  from (irb):26
  from /path/to/gemset/railties-4.0.2/lib/rails/commands/console.rb:90:in 
`start'
  from /path/to/gemset/railties-4.0.2/lib/rails/commands/console.rb:9:in 
`start'
  from /path/to/gemset/railties-4.0.2/lib/rails/commands.rb:62:in `<top 
(required)>'
  from bin/rails:4:in `require'
  from bin/rails:4:in `<main>'
2.1.0 :016 > MyModule::MyClass.to_s
 => "MyModule::MyClass" 

I'm curious what the circular dependency would be there, since there are no 
other references to the class, afaik.

Thanks!

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/rubyonrails-core.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to