Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does "Anonymous modules have no name to be referenced by" really mean?

I'm upgrading my Rails app to work with Ruby 1.9 and I keep encountering errors like this:

Anonymous modules have no name to be referenced by
/home/foo/.gem/ruby/1.9.1/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:585:in `to_constant_name'
/home/foo/.gem/ruby/1.9.1/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:391:in `qualified_name_for'
/home/foo/.gem/ruby/1.9.1/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:104:in `rescue in const_missing'
/home/foo/.gem/ruby/1.9.1/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:94:in `const_missing'
/home/foo/app/config/environment.rb:66:in `block in <top (required)>'
etc.

Google finds all kinds of hits for this, but each of them pertains to a specific fix for one specific gem or app. None of them explain what the message really means.

  • What is an "anonymous module"?
  • Where is this error message coming from? (The Ruby interpreter itself?)
  • What is different about Ruby 1.9 that causes this? (Rails 2.3.8 with Ruby 1.8.7 does not encounter this.)
  • What is the general/proper way to fix this error?

Line 66 of environment.rb is the configuration for super_exception_notifier (old version, 2.0.8):

ExceptionNotifier.configure_exception_notifier do |config|
  config[:sender_address] = %("Foo" <[email protected]>)
  config[:exception_recipients] = %w([email protected])
  config[:skip_local_notification] = false
end

From what I can tell, ExceptionNotifier is undefined, and ActiveSupport is trying to magically load it, but fails and then fails again trying to print a nice error message.

like image 335
ScottJ Avatar asked Oct 23 '10 00:10

ScottJ


3 Answers

An anonymous module is a module that is declared like so:

Fred = Module.new do
  def meth1
    "hello"
  end
  def meth2
    "bye"
  end
end

instead of by using the regular Module mod_name <block> syntax. Since they have no module name, you can't retrieve the module name. to_constant_name is attempting to call desc.name.blank? where desc is an anonymous module (with no name).

This error is coming from the ActiveSupport module, which may indicate a bug in the active_support gem or may indicate that some other piece of code is using ActiveSupport incorrectly. The error message alone doesn't give enough information to identify the culprit (to me at least, someone with more rails experience might be able to provide more insight).

Without knowing the offending code it's also hard to say exactly why this error is popping up with 1.9, or what needs to be done to fix it. Considering that there are a lot of un- and under-maintained gems out there that have not been updated for 1.9 yet, I would suspect that ActiveSupport is not the source of the problem. Upgrade all of your gems that have 1.9-compatible versions, and then try disabling your other gems one at a time (if you can) and see if you still get the error.

If you provide a list of the other gems that you are using, someone else who may have encountered the error before may be able to provide some details.

like image 79
bta Avatar answered Nov 17 '22 06:11

bta


This may happen if you try to exploit ActiveRecord's internal class and module contexts in the wrong way. I had this error yesterday while working on a gem which extends deep inner workings of ActiveRecord. I finally managed to get around this problem by redesigning my code which exploits the inner contexts. It would be interesting to see the surrounding lines of environment.rb:66 for further analysis.

like image 38
hurikhan77 Avatar answered Nov 17 '22 05:11

hurikhan77


This may happen when the class name doesn't match the filename, in my case it was a file named application.rb contaning the ApplicationController class. Renaming the file to application_controller.rb solved the problem.

like image 44
Johannes Thoma Avatar answered Nov 17 '22 05:11

Johannes Thoma