ruby-on-rails - "Anonymous modules have no name to be referenced by"到底是什么意思?

标签 ruby-on-rails ruby 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.

谷歌为此找到了各种匹配项,但每个匹配项都与针对某个特定 gem 或应用程序的特定修复有关。他们都没有解释消息的真正含义。

  • 什么是“匿名模块”?
  • 这条错误信息是从哪里来的? (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

据我所知,ExceptionNotifier 是未定义的,ActiveSupport 正试图神奇地加载它,但失败了,然后再次失败,试图打印一条不错的错误消息。

最佳答案

匿名模块是这样声明的模块:

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。错误消息本身并不能提供足够的信息来识别罪魁祸首(至少对我来说,具有更多 Rails 经验的人可能能够提供更多见解)。

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

如果您提供了您正在使用的其他 gem 的列表,那么之前可能遇到过该错误的其他人可能能够提供一些详细信息。

关于ruby-on-rails - "Anonymous modules have no name to be referenced by"到底是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4001778/

相关文章:

Ruby:合并包含数组的哈希

ruby - Ruby 中的 class() 与 type()

ruby-on-rails-3 - ActionModel 未定义方法 'on'

mysql。基于临时列排序

ruby-on-rails - rails 3.2 + OSX : Cannot install rmagick gem

javascript - 为什么 CKEDITOR 在我的 Rails 生产站点中找不到编辑器的图标?

mysql - 有_许多 :through with a foreign key with 2 tables

ruby-on-rails - 如何使用 Ruby on Rails 和 Haml 在当前迭代中访问数组中的下一项?

ruby - 是什么阻碍了您编写特定于 ruby​​ 1.9 的代码?

ruby - 更改 Rubinius Ruby 版本