Witam, mam engine który dodaje metody do modelu User w ten sposób
# engine.rb
module Badges
class Engine < ::Rails::Engine
initializer :add_methods_for_badge_conditions do
User.activated_badges.each do |badge_name|
User.send :include, "Badges::#{badge_name.to_s.camelcase}".constantize
end
end
przykładowy moduł z metodą która ma być dodana:
module Badges::Badges::Biographer
def deserves_biographer_badge?
!self.bio.blank?
end
end
Na produkcji wszystko działa ok, na test także, ale na development od czasu do czasu dostaje komunikat że dana metoda jest niezdefiniowana. Po restarcie serwera wszystko działa normalnie. Podejrzewam że może chodzić o to że na produkcji klasy są cachowane a na development przy każdym requeście ładowane od nowa ?
No… nie. Zauważ, że User.activated_badges zwróci ci listę odznak. Dodajesz je w initializerze, więc tylko przy starcie serwera.
Następnie dodajesz jakaś odznakę (klasę) podczas gdy serwer na dev dalej chodzi. Ta odznaka nie dołączy już swoich metod z klasy, bo initializer już się wykonał i dlatego tylko restart pomaga. Według mnie źle do tego podchodzisz.
Co oznacza User.activated_badges? Nie lepiej dodać wszystkie Badges::XXX do modułu Badges::All i dołączać to bezpośrednio poprzez w samym modelu?
module Badges
module All
include 'A'
include 'B'
end
end
i w user.rb
class User
include Badges::All
end
W ten sposób masz pewność, że zawsze klasa będzie dobrze przeładowana.
Wydaje mi sie że błąd występuje tylko gdy używam zdalnego repozytorium, gdy ładuje engine lokalnie jest ok. Ale czasem ze zdalnego także działa, ciężko tu o prawidłowość