ruby-on-rails – “匿名模块没有名称被引用”是什么意思?

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – “匿名模块没有名称被引用”是什么意思?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在升级我的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版本的宝石,然后尝试一次禁用其他宝石(如果可以),看看你是否仍然收到错误.

如果您提供您正在使用的其他宝石的列表,可能以前遇到错误的其他人可能会提供一些细节.

猜你在找的Ruby相关文章