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

Я использую 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?

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

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


person Andy Harvey    schedule 24.02.2016    source источник
comment
Код инициализатора запускается один раз при старте сервера, также в среде разработки. При изменении кода требуется перезагрузка.   -  person Mareq    schedule 24.02.2016
comment
спасибо Марек. Этот код инициализатора в настоящее время не изменяется. Я работаю с контроллерами и представлениями. Вы все еще ожидаете, что эти перезагрузки будут необходимы?   -  person Andy Harvey    schedule 24.02.2016
comment
Странный. Таким образом, похоже, что код каким-то образом перезагружается, и ваши материалы заменяются оригинальным контентом.   -  person Mareq    schedule 24.02.2016
comment
После дополнительного расследования выяснилось, что эта проблема возникает после возникновения любой другой ошибки. Например, если я забуду определить переменную и загрузить страницу, я получу ошибку об этой переменной, исправлю, перезагрузлю, а затем ошибку PaperTrail. Нормально ли, что инициализаторы «перезагружаются» или «выгружаются» после возникновения исключения?   -  person Andy Harvey    schedule 26.02.2016


Ответы (1)


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

Из https://github.com/airblade/paper_trail/pull/492

Теперь исходный код paper_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
person Andy Harvey    schedule 30.04.2016