我正在升级我的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会为此找到各种各样的命中,但每个都属于一个特定的宝石或应用程序的特定修复.他们都没有解释什么是真正的意思.
>什么是“匿名模块”?
>这个错误信息来自哪里? (Ruby解释器本身?)
> Ruby 1.9有什么区别? (Rails 2.3.8与Ruby 1.8.7不会遇到这种情况)
>解决这个错误的一般/正确的方法是什么?
环境的第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正在尝试神奇地加载它,但失败,然后再次尝试打印一个很好的错误消息.
解决方法
一个匿名模块是一个如此声明的模块:
Fred = Module.new do def meth1 "hello" end def meth2 "bye" end end
而不是使用常规的模块mod_name< block>句法.由于它们没有模块名称,因此您无法检索模块名称. to_constant_name正在尝试调用desc.name.blank?其中desc是匿名模块(没有名称).
这个错误来自ActiveSupport模块,这可能表示active_support gem中的错误,或者可能指示其他一些代码正在使用ActiveSupport.单独的错误消息并没有提供足够的信息来识别罪魁祸首(至少对我来说,有更多的铁路经验的人可能能够提供更多的洞察力).
不知道有罪的代码,也很难说出这个错误为什么会弹出1.9,或者需要做什么来修复它.考虑到有很多未经维护和不足的宝石,尚未更新1.9,我怀疑ActiveSupport不是问题的根源.升级所有的1.9版本的宝石,然后尝试一次禁用其他宝石(如果可以),看看你是否仍然收到错误.
如果您提供您正在使用的其他宝石的列表,可能以前遇到错误的其他人可能会提供一些细节.