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

Sco*_*ttJ 12 ruby ruby-on-rails 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.
Run Code Online (Sandbox Code Playgroud)

谷歌为此找到了各种各样的点击,但每个点击都针对一个特定的宝石或应用程序的特定修复.他们都没有解释这个消息的真正含义.

  • 什么是"匿名模块"?
  • 此错误消息来自何处?(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
Run Code Online (Sandbox Code Playgroud)

据我所知,ExceptionNotifier是未定义的,ActiveSupport试图神奇地加载它,但是失败然后再次尝试打印一个很好的错误消息失败.

bta*_*bta 6

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

Fred = Module.new do
  def meth1
    "hello"
  end
  def meth2
    "bye"
  end
end
Run Code Online (Sandbox Code Playgroud)

而不是使用常规Module mod_name <block>语法.由于它们没有模块名称,因此无法检索模块名称. to_constant_name试图调用desc.name.blank?这里desc是一个匿名模块(无name).

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

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

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