Ответ 1
Это сложно.
Что для меня обычно работает, это запустить "script/console production" на рабочем сервере и ввести:
Announcement
Это обычно даст вам лучшее сообщение об ошибке. Но вы сказали, что уже пробовали это?
Я видел, что эта проблема возникает во многих разных обстоятельствах и хотела бы получить лучшие рекомендации по ее исправлению/отладке в StackOverflow.
Чтобы использовать пример реального мира, это произошло сегодня утром:
expected announcement.rb to define Announcement
Класс отлично работал в разработке, тестировании и с производственной консоли, но не смог в производстве Mongrel. Здесь класс:
class Announcement < ActiveRecord::Base
has_attachment :content_type => 'audio/mp3', :storage => :s3
end
Проблема, которую я хотел бы затронуть в ответах, заключается не столько в решении этой конкретной проблемы, а в том, как правильно отлаживать, чтобы получить Rails, чтобы дать вам значимую ошибку, как ожидалось. x.rb для определения X.rb 'часто является красным сельдь...
Изменить (3 замечательных ответа до сих пор, каждый с частичным решением)
Debugging:
От Joe Van Dyk: попробуйте получить доступ к модели через консоль в среде/экземпляре, которая вызывает ошибку (в приведенном выше примере: script/console production, затем введите "Объявление".
От Отто: попробуйте установить минимальный набор плагинов через инициализатор, например: config.plugins = [: exception_notification,: ssl_requirement,: all], затем повторно включить один за раз.
Конкретные причины:
От Ian Terrell: если вы используете attachment_fu, убедитесь, что у вас установлен правильный процессор изображений. attachment_fu потребует его, даже если вы не прикрепляете изображение.
От Отто: убедитесь, что вы не назвали модель, которая конфликтует со встроенным классом Rails, например: Request.
От Josh Lewis: убедитесь, что у вас нет дублированных имен классов или модулей где-то в вашем приложении (или в списке Gem).
Это сложно.
Что для меня обычно работает, это запустить "script/console production" на рабочем сервере и ввести:
Announcement
Это обычно даст вам лучшее сообщение об ошибке. Но вы сказали, что уже пробовали это?
Я столкнулся с этим раньше, и винил плагин AttachmentFu
. В моем случае я полагаю, что из-за AttachmentFu
ожидалось, что другой процессор изображения будет больше, чем тот, который был доступен, или были установлены не поддерживаемые версии. Проблема была решена, когда я явно добавил :with => :rmagick
(или аналогичный - я использовал RMagick) к вызову метода has_attachment
даже для вложений без изображения. Очевидно, убедитесь, что ваша производственная среда имеет все необходимые драгоценные камни (или заморозить их в вашем приложении) и установленное программное обеспечение (ImageMagick). YMMV.
Что касается того, что Rails и AttachmentFu не вставляют и не скрывают реальную ошибку, мы исправили ее, прежде чем полностью ее понять.
Поскольку это все еще главный результат Google, я думал, что поделился тем, что исправило проблему для меня:
У меня был модуль в папке lib с тем же именем, что и мое приложение. Итак, у меня был конфликт в именах модулей, но у меня также был конфликт имен папок (не уверен, что последнее действительно имеет значение, хотя).
Итак, для OP убедитесь, что у вас нет дублированных имен классов или модулей где-то в вашем приложении (или в списке Gem).
Для меня причиной была круговая зависимость в определениях моего класса, и проблема появилась только при использовании автотеста в Rails. В моем случае мне не нужна круговая зависимость, поэтому я просто удалил ее.
Я просто столкнулся с этой ошибкой.
Короче говоря, мой rb файл в моей папке lib не был в структуре папок, чтобы соответствовать моему соглашению об именах модулей. Это заставило автозагрузчик ActiveSupport использовать неправильный модуль, чтобы определить, была ли определена константа класса.
В частности, я определил следующий класс
module Foo
class Bar
end
end
В корне файла /lib/bar.rb
Это заставило автозагрузчик запросить модуль Object, если была определена Bar вместо модуля Foo.
Перемещение моего rb файла в /lib/foo/bar.rb устраняет эту проблему.
Вы можете попробовать отключить все свои плагины и добавить их обратно по одному.
В environment.rb
в разделе Initalizer добавьте строку, подобную этой:
config.plugins = [ :exception_notification, :ssl_requirement, :all ]
Начните с минимального набора для запуска приложения и добавьте его по одному. Обычно я получаю эту ошибку, когда я определил модель, которая происходит с отображением существующего имени файла. Например, модель запроса, но Rails уже имеет request.rb, который сначала загружается.
У меня была эта проблема некоторое время, и в моем случае ошибке всегда предшествовала эта ошибка S3:
(AWS:: S3:: Operation Aborted) "A конфликтная условная операция в настоящее время ресурс. Повторите попытку."
Эта проблема обычно возникает при создании одного и того же ведра снова и снова. (Источник Форум разработчиков AWS)
Это было связано с тем, что я использовал attachment_fu to
создать ведро, и я разложил строку, содержащую команду Bucket.create(@@bucket_name)
в lib/technoweenie/attachment_fu/backends/s3_backends.rb
(рядом с строкой 152).
После комментирования или удаления команды Bucket.create(@@bucket_name)
проблема исчезла.
Надеюсь, это поможет.
Изменение имен классов при использовании STI вызвало это для меня:
Исправить: выполнить миграцию, чтобы обновить значения в столбце "type", чтобы соответствовать новому имени класса.
в моем случае, я получаю эту ошибку в консоли разработки, но я могу загрузить класс в irb
Извините, это не окончательный ответ, а другой подход, который может работать в некоторых конкретных обстоятельствах:
Я просто столкнулся с этой проблемой при отладке сайта с использованием Ruby 1.8.7 и Merb 1.0.15. Казалось, что класс, о котором идет речь (пусть его называют SomeClass), выпадает из области видимости, но когда файл some_class.rb был автоматически загружен, другие необходимые ему файлы (some_class/base.rb и т.д.) Не были загружены механизмом require. Возможно, требуется ошибка?
Если мне раньше требовался файл some_class, например, конец environment.rb, он, кажется, предотвращает выпадение объекта из области.
Я получал эту ошибку, чтобы определение контроллера находилось в файле, который не был назван контроллером. Например, у вас есть модель комментариев, и вы определяете контроллер в файле comment.rb вместо comments_controller.rb
У меня возникла проблема с рельсами версии 1.2.3. Я мог бы воспроизвести проблему только с mongrel, используя доступ к среде консоли, не дал никакой полезной информации. В моем случае я решил сделать папку RAILS_ROOT/html доступной для записи mongrel, а затем перезапустить веб-сервер, как сообщили некоторые пользователи здесь:
Когда я обновил рельсы с 1.1.6 до 1.2.6 и 2.0.5 для своего приложения, я столкнулся с этой ошибкой. Короче говоря, старые плагины вызвали эту ошибку. Эти плагины уже устарели и больше не обновляются (даже без репо!). После того, как я их удалил, приложение работало на 1.2.6 и 2.0.5. Но я не проверял исходный код детали плагинов.