什么“匿名模块没有名称可以引用”真的是什么意思?

时间:2010-10-23 00:08:30

标签: ruby-on-rails ruby ruby-1.9

我正在升级我的Rails应用程序以使用Ruby 1.9并且我一直遇到这样的错误:

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为此找到各种点击,但每个点击都针对某个特定gem或应用的特定修复程序。他们都没有解释这个消息的真正含义。

  • 什么是“匿名模块”?
  • 此错误消息来自何处? (Ruby解释器本身?)
  • 导致这种情况的Ruby 1.9有什么不同? (使用Ruby 1.8.7的Rails 2.3.8不会遇到这种情况。)
  • 修复此错误的一般/正确方法是什么?

environment.rb的第66行是super_exception_notifier(旧版本,2.0.8)的配置:

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

据我所知,ExceptionNotifier是未定义的,ActiveSupport正试图神奇地加载它,但是失败然后再次尝试打印一条漂亮的错误消息失败。

4 个答案:

答案 0 :(得分:6)

匿名模块是一个声明如下的模块:

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

而不是使用常规Module mod_name <block>语法。由于它们没有模块名称,因此无法检索模块名称。 to_constant_name正在尝试致电desc.name.blank?,其中desc是一个匿名模块(没有name)。

此错误来自ActiveSupport模块,该模块可能表示active_support gem中存在错误,或者可能表示某些其他代码错误地使用了ActiveSupport。单独的错误消息没有提供足够的信息来识别罪魁祸首(至少对我来说,拥有更多铁路经验的人可能能够提供更多的洞察力)。

在不知道有问题的代码的情况下,很难确切地说出为什么这个错误突然出现在1.9,或者需要做些什么来解决它。考虑到有很多未维护和维护不足的宝石尚未针对1.9进行更新,我怀疑ActiveSupport不是问题的根源。升级所有具有1.9兼容版本的宝石,然后尝试一次禁用其他宝石(如果可以),看看是否仍然出现错误。

如果您提供正在使用的其他宝石的列表,之前可能遇到此错误的其他人可能会提供一些详细信息。

答案 1 :(得分:3)

如果您尝试以错误的方式利用ActiveRecord的内部类和模块上下文,则可能会发生这种情况。我昨天在处理一个扩展了ActiveRecord深层内部工作的gem时遇到了这个错误。我终于设法通过重新设计利用内部上下文的代码来解决这个问题。看到周围的environment.rb:66行进行进一步分析会很有趣。

答案 2 :(得分:1)

当类名与文件名不匹配时,可能会发生这种情况 我的情况是一个名为application.rb的文件,它包含了ApplicationController 类。将文件重命名为application_controller.rb解决了这个问题。

答案 3 :(得分:0)

当我收到此错误时,这是​​由于定义一个类时拼写错误。如果您收到此错误,可能需要检查拼写错误的模块和类定义。