Что на самом деле означает «анонимные модули не имеют имен, на которые ссылаются»? - PullRequest
12 голосов
/ 23 октября 2010

Я обновляю свое приложение 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 environment.rbконфигурация для 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 пытается магически загрузить его, но не удаетсязатем снова не удается распечатать хорошее сообщение об ошибке.

Ответы [ 4 ]

6 голосов
/ 23 октября 2010

Анонимный модуль - это модуль, который объявлен так:

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или может указывать на то, что какой-то другой фрагмент кода использует ActiveSupport неправильно.Одно только сообщение об ошибке не дает достаточно информации, чтобы идентифицировать виновника (по крайней мере, мне, кто-то с большим опытом работы с рельсами, мог бы предоставить более глубокое понимание).

Не зная обидного кода, также трудно сказатьпочему эта ошибка появляется в версии 1.9, или что нужно сделать, чтобы ее исправить.Учитывая, что существует множество необслуживаемых и недостаточно поддерживаемых жемчужин, которые еще не были обновлены для 1.9, я подозреваю, что ActiveSupport не является источником проблемы.Обновите все ваши драгоценные камни, которые имеют 1.9-совместимые версии, а затем попробуйте отключить другие ваши драгоценные камни по одной за раз (если можете) и посмотрите, по-прежнему ли вы получаете ошибку.

Если вы предоставите списокдругие драгоценные камни, которые вы используете, кто-то, кто мог столкнуться с ошибкой раньше, может предоставить некоторые детали.

3 голосов
/ 23 октября 2010

Это может произойти, если вы попытаетесь использовать внутренний контекст класса и модуля ActiveRecord неверным образом. У меня была эта ошибка вчера, когда я работал над гемом, который расширяет внутреннюю работу ActiveRecord. В конце концов мне удалось обойти эту проблему, переработав мой код, который использует внутренний контекст. Было бы интересно увидеть окружающие линии environment.rb:66 для дальнейшего анализа.

1 голос
/ 10 января 2013

Это может произойти, если имя класса не совпадает с именем файла, в В моем случае это был файл с именем application.rb, содержащий ApplicationController учебный класс. Переименование файла в application_controller.rb решило проблему.

0 голосов
/ 04 декабря 2012

Когда я получил эту ошибку, это было связано с ошибкой при определении класса. Если вы получаете эту ошибку, возможно, стоит проверить определения вашего модуля и класса на предмет опечаток.

...