2010-07-22 1 views
1

Недавно я столкнулся с нечетной ошибкой, которая произошла только в режиме производства.Ошибка при перезаписывании класса Ruby проявляется только в производстве?

Я использовал дорожки славы, которые определяют класс Achievement (http://github.com/paulca/paths_of_glory/blob/master/app/models/achievement.rb).

В базовом классе, определяется уровень:

def level(level, options = {}) 
    levels << {:level => level, :quota => options[:quota]} 
end 

Пути славы самоцвета работы, имея создавать модели, которые наследуют от базовой модели достижения.

Чтобы добавить дополнительный метод к базовому классу Achievement, мы (ошибочно, ретроспективно) создали новые модели/aachievements.rb (да, преднамеренная орфографическая ошибка, так как Rails попытается загрузить Achievement, если мы позвоним его success.rb), но вместо повторного открытия класса мы переопределили класс. Поскольку наше переопределение не включало уровень, когда мы были развернуты на производство, мы попали в ошибку, уровень которой был методом undef.

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

Любые идеи?

ответ

1

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

В любом случае включите классы cache в development.rb в средах и посмотрите, что произойдет.

+0

Ну, эта ошибка произошла в производстве, так это значит, что это происходит, когда cached_classes включены? – shedd

+0

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