Как исправить / отладить 'ожидаемый x.rb для определения X.rb' в Rails - PullRequest
22 голосов
/ 18 сентября 2008

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

  1. От Джо Ван Дейка: попробуйте получить доступ к модели через консоль в среде / экземпляре, которая вызывает ошибку (в случае выше: создание сценария / консоли, затем введите «Объявление».

  2. От Отто: Попробуйте установить минимальный набор плагинов через инициализатор, например: config.plugins = [: exception_notification,: ssl_requirement,: all], затем включите по одному за раз.

Конкретные причины:

  1. От Иана Террелла: если вы используете attachment_fu, убедитесь, что у вас установлен правильный процессор изображений. attachment_fu потребует его, даже если вы не прикрепляете изображение.

  2. От Отто: убедитесь, что вы не назвали модель, которая конфликтует со встроенным классом Rails, например: Request.

  3. От Джоша Льюиса: убедитесь, что у вас нет дублированных имен классов или модулей в вашем приложении (или списке драгоценных камней).

Ответы [ 13 ]

11 голосов
/ 18 сентября 2008

Это сложно.

Для меня обычно работает "производство скриптов / консолей" на рабочем сервере и введите:

Announcement

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

3 голосов
/ 10 июля 2013

Я тоже столкнулся с этой ошибкой.

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

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

module Foo
  class Bar
  end
end

В корне /lib/bar.rb

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

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

2 голосов
/ 24 ноября 2012

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

2 голосов
/ 25 августа 2012

Так как это по-прежнему лучший результат Google, я подумал, что поделюсь, что решило проблему для меня:

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

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

2 голосов
/ 18 сентября 2008

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

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

1 голос
/ 05 сентября 2012

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

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

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

1 голос
/ 29 июля 2009

У меня была эта проблема некоторое время, и в моем случае этой ошибке S3 всегда предшествовала ошибка:

(AWS :: S3 :: Операция прервана) "A противоречивая условная операция в настоящее время ведется против этого ресурс. Пожалуйста, попробуйте еще раз. "

Эта проблема обычно возникает при создании одного и того же сегмента снова и снова. (Источник Форум разработчиков AWS )

Это было связано с тем, что я использовал attachment_fu to для создания корзины, и я разложил строку, содержащую команду Bucket.create(@@bucket_name) в lib/technoweenie/attachment_fu/backends/s3_backends.rb (рядом со строкой 152).

После того, как прокомментировал или удалил команду Bucket.create(@@bucket_name) проблема исчезла.

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

1 голос
/ 19 сентября 2008

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

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

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

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

0 голосов
/ 01 октября 2016

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

0 голосов
/ 08 ноября 2012

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

http://www.ruby -forum.com / тема / 77708

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...