Używam następującego wiersza w inicjalizatorze, aby automatycznie załadować kod w moim /lib
katalogu podczas programowania:
config / initializers / custom.rb:
RELOAD_LIBS = Dir[Rails.root + 'lib/**/*.rb'] if Rails.env.development?
(z podręcznika Rails 3: Automatyczne ładowanie folderów lib w trybie programowania )
Działa świetnie, ale jest zbyt nieefektywny w produkcji - Zamiast ładować biblioteki lib na każde żądanie, chcę je załadować przy uruchomieniu. Ten sam blog ma inny artykuł opisujący, jak to zrobić:
config / application.rb:
# Custom directories with classes and modules you want to be autoloadable.
config.autoload_paths += %W(#{config.root}/lib)
config.autoload_paths += Dir["#{config.root}/lib/**/"]
Jednak po przejściu na to, nawet w fazie rozwoju, dostaję NoMethodErrors, gdy próbuję użyć funkcji lib.
Przykład jednego z moich plików lib:
lib / extensions.rb:
Time.class_eval do
def self.milli_stamp
Time.now.strftime('%Y%m%d%H%M%S%L').to_i
end
end
Wywołanie Time.milli_stamp
spowoduje zgłoszenie NoMethodError
Zdaję sobie sprawę, że inni odpowiedzieli na podobne pytania dotyczące SO, ale wszystkie wydają się mieć do czynienia z konwencjami nazewnictwa i innymi zagadnieniami, o które nie musiałem się wcześniej martwić - Moje klasy lib już działały przy ładowaniu na żądanie, po prostu chcę to zmienić do per- startowego załadunku. Jak to zrobić?