Подтвердить что ты не робот

На что "анонимные модули не имеют имени, на которое можно ссылаться", действительно означает?

Я обновляю приложение 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 среды .rb - это конфигурация super_exception_notifier (старая версия, 2.0.8):

ExceptionNotifier.configure_exception_notifier do |config|
  config[:sender_address] = %("Foo" <[email protected]>)
  config[:exception_recipients] = %w([email protected])
  config[:skip_local_notification] = false
end

Из того, что я могу сказать, ExceptionNotifier - это undefined, и ActiveSupport пытается магически загрузить его, но сбой и затем снова пытается распечатать приятное сообщение об ошибке.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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