微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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版本的宝石,然后尝试一次禁用其他宝石(如果可以),看看你是否仍然收到错误.

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

原文地址:https://www.jb51.cc/ruby/271473.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐