Почему методы, определенные в инициализаторе, периодически вызывают ошибку "не определено", которая устраняется путем перезапуска сервера?

Я использую PaperTrail 4.1 с Rails 4.2.

Я определил несколько пользовательских методов в инициализаторе (см.: Как добавить метод в модель версий Paper_trail?)

#config/initializers/paper_trail.rb
PaperTrail::Rails::Engine.eager_load!
module PaperTrail
  class Version < ActiveRecord::Base
    scope :scoped,      lambda { #selects some records }
    def custom_method
      #does some stuff
    end
  end
end

Время от времени в среде разработки я получаю method not defined error для методов / областей, определенных в этом инициализаторе.

Перезапуск сервера устраняет проблему.

Почему эти методы "теряются" для Rails?

Это проблема, которая также будет присутствовать в производстве или в других средах?

Какие шаги я могу предпринять, чтобы найти причину этой проблемы?

1 ответ

Решение

Для всех, кто прибывает сюда, очевидно, это известная проблема с PaperTrail

С https://github.com/airblade/paper_trail/pull/492

Теперь источник get_trail загружается в среду разработки при сохранении файла, что означает, что класс удаляется из кэша и перестраивается из источников paper_trail. Инициализатор не интерпретируется снова, так как они только один раз, без module_eval, без абстрактного класса -> исключения.

И исправление было включено в последнюю версию драгоценного камня: https://github.com/airblade/paper_trail/pull/557

По сути, больше не рекомендуется использовать инициализатор для добавления пользовательских методов в PaperTrail, а вместо этого использовать модель, которая наследуется от PaperTrail (которая намного лучше подходит для AR).

# app/models/paper_trail/version.rb
module PaperTrail
  class Version < ActiveRecord::Base
    include PaperTrail::VersionConcern
    # my custom methods
  end
end
Другие вопросы по тегам