Jest to trudne do wyjaśnienia. Mam moduł w innej przestrzeni nazw modułu tak:Szyny niezdolne do autoloadowania stałej z pliku, mimo że zdefiniowano go w tym pliku.
# app/models/points/calculator.rb
module Points
module Calculator
def self.included(base)
base.send(:include, CommonMethods)
base.send(:include, "Points::Calculator::#{base}Methods".constantize)
end
end
end
Więc w innych klasach wszystko co musisz zrobić, to:
class User
include Points::Calculator
end
Mam ten katalog określony w environment.rb być autoloadable ... (chociaż myślę, że szyny powtarzają się przez modele ...)
config.autoload_paths += Dir[ Rails.root.join('app', 'models', "points") ]
W środowisku rozwojowym wszystko działa dobrze. Podczas uruchamiania testów (i env produkcja), pojawia się następujący błąd:
Unable to autoload constant Points::Calculator, expected /Users/pete/work/recognize/app/models/points/calculator.rb to define it (LoadError)
I rzeczywiście po radę, żeby rozwiązać ten problem: Stop Rails from unloading a module in development mode jawnie wymagając calculator.rb w environment.rb.
Dlaczego tak się dzieje?
Utknąłem niektóre dane wyjściowe debugowania w pliku dependencies.rb ActiveSupport i zauważyłem, że plik ten jest wymagany dwukrotnie. Za pierwszym razem, gdy jest to wymagane, widzę, że stała jest rzeczywiście załadowana.
Ale po raz drugi wymagana stała została rozładowana tak długo, jak Railsy mogą powiedzieć, ale kiedy faktyczne wymaganie jest wywoływane, ruby zwraca false, ponieważ ruby wie, że jest już to wymagane. Następnie Railsy zgłaszają błąd "nie może się automatycznie ładować", ponieważ stała wciąż nie jest obecna, a rubin nie "wymaga ponownego" tego pliku.
Czy ktoś może rzucić światło na to, dlaczego tak się dzieje?
Czy usuwanie punktów z utraconych ścieżek, które można samodzielnie ładować, pomaga? To nie powinno być konieczne –
Tak, próbowałem go z i bez w ścieżce autoload. Taki sam problem. –
Wydaje się, że masz ten sam problem. Bardzo denerwujące, że muszę wymagać zajęć, ponieważ mam około 30 takich zajęć. – Kohanz