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

Как исправить/отладить "ожидаемый x.rb для определения X.rb" в Rails

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

4b9b3361

Ответ 1

Это сложно.

Что для меня обычно работает, это запустить "script/console production" на рабочем сервере и ввести:

Announcement

Это обычно даст вам лучшее сообщение об ошибке. Но вы сказали, что уже пробовали это?

Ответ 2

Я столкнулся с этим раньше, и винил плагин AttachmentFu. В моем случае я полагаю, что из-за AttachmentFu ожидалось, что другой процессор изображения будет больше, чем тот, который был доступен, или были установлены не поддерживаемые версии. Проблема была решена, когда я явно добавил :with => :rmagick (или аналогичный - я использовал RMagick) к вызову метода has_attachment даже для вложений без изображения. Очевидно, убедитесь, что ваша производственная среда имеет все необходимые драгоценные камни (или заморозить их в вашем приложении) и установленное программное обеспечение (ImageMagick). YMMV.

Что касается того, что Rails и AttachmentFu не вставляют и не скрывают реальную ошибку, мы исправили ее, прежде чем полностью ее понять.

Ответ 3

Поскольку это все еще главный результат Google, я думал, что поделился тем, что исправило проблему для меня:

У меня был модуль в папке lib с тем же именем, что и мое приложение. Итак, у меня был конфликт в именах модулей, но у меня также был конфликт имен папок (не уверен, что последнее действительно имеет значение, хотя).

Итак, для OP убедитесь, что у вас нет дублированных имен классов или модулей где-то в вашем приложении (или в списке Gem).

Ответ 4

Для меня причиной была круговая зависимость в определениях моего класса, и проблема появилась только при использовании автотеста в Rails. В моем случае мне не нужна круговая зависимость, поэтому я просто удалил ее.

Ответ 5

Я просто столкнулся с этой ошибкой.

Короче говоря, мой rb файл в моей папке lib не был в структуре папок, чтобы соответствовать моему соглашению об именах модулей. Это заставило автозагрузчик ActiveSupport использовать неправильный модуль, чтобы определить, была ли определена константа класса.

В частности, я определил следующий класс

module Foo
  class Bar
  end
end

В корне файла /lib/bar.rb

Это заставило автозагрузчик запросить модуль Object, если была определена Bar вместо модуля Foo.

Перемещение моего rb файла в /lib/foo/bar.rb устраняет эту проблему.

Ответ 6

Вы можете попробовать отключить все свои плагины и добавить их обратно по одному.

В environment.rb в разделе Initalizer добавьте строку, подобную этой:

config.plugins = [ :exception_notification, :ssl_requirement, :all ]

Начните с минимального набора для запуска приложения и добавьте его по одному. Обычно я получаю эту ошибку, когда я определил модель, которая происходит с отображением существующего имени файла. Например, модель запроса, но Rails уже имеет request.rb, который сначала загружается.

Ответ 7

У меня была эта проблема некоторое время, и в моем случае ошибке всегда предшествовала эта ошибка 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) проблема исчезла.

Надеюсь, это поможет.

Ответ 8

Изменение имен классов при использовании STI вызвало это для меня:

  • Класс изменен с 'EDBeneficiary' на 'EdBeneficiary'
  • Существующие записи имели "EDBeneficiary", хранящиеся в столбце "type", поэтому, когда Rails пыталась загрузить их, было создано исключение.

Исправить: выполнить миграцию, чтобы обновить значения в столбце "type", чтобы соответствовать новому имени класса.

Ответ 9

в моем случае, я получаю эту ошибку в консоли разработки, но я могу загрузить класс в irb

Ответ 10

Извините, это не окончательный ответ, а другой подход, который может работать в некоторых конкретных обстоятельствах:

Я просто столкнулся с этой проблемой при отладке сайта с использованием Ruby 1.8.7 и Merb 1.0.15. Казалось, что класс, о котором идет речь (пусть его называют SomeClass), выпадает из области видимости, но когда файл some_class.rb был автоматически загружен, другие необходимые ему файлы (some_class/base.rb и т.д.) Не были загружены механизмом require. Возможно, требуется ошибка?

Если мне раньше требовался файл some_class, например, конец environment.rb, он, кажется, предотвращает выпадение объекта из области.

Ответ 11

Я получал эту ошибку, чтобы определение контроллера находилось в файле, который не был назван контроллером. Например, у вас есть модель комментариев, и вы определяете контроллер в файле comment.rb вместо comments_controller.rb

Ответ 12

У меня возникла проблема с рельсами версии 1.2.3. Я мог бы воспроизвести проблему только с mongrel, используя доступ к среде консоли, не дал никакой полезной информации. В моем случае я решил сделать папку RAILS_ROOT/html доступной для записи mongrel, а затем перезапустить веб-сервер, как сообщили некоторые пользователи здесь:

http://www.ruby-forum.com/topic/77708

Ответ 13

Когда я обновил рельсы с 1.1.6 до 1.2.6 и 2.0.5 для своего приложения, я столкнулся с этой ошибкой. Короче говоря, старые плагины вызвали эту ошибку. Эти плагины уже устарели и больше не обновляются (даже без репо!). После того, как я их удалил, приложение работало на 1.2.6 и 2.0.5. Но я не проверял исходный код детали плагинов.