我正在升级我的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或应用的特定修复程序。他们都没有解释这个消息的真正含义。
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正试图神奇地加载它,但是失败然后再次尝试打印一条漂亮的错误消息失败。
答案 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)
当我收到此错误时,这是由于定义一个类时拼写错误。如果您收到此错误,可能需要检查拼写错误的模块和类定义。