2011-07-29 20 views
6

przechowywać wartość w zmiennej klasy wewnątrz modułu, takie jak:Moduł pobiera przeładował każdą prośbę dane tak zainicjowany zostaną utracone

module TranslationEnhancer 
    def self.install! klass 
    @dictionaries ||= [] << klass 
    end 
    ... 
end 

nazywam to od inicjatora w config/inicjalizatorów:

require Rails.root + "lib" + "translation_enhancer.rb" 
TranslationEnhancer::install! TranslationDictionary 

Teraz, jeśli uruchomię serwer w środowisku programistycznym, wszystko będzie w porządku podczas pierwszego żądania. Jednak po tym żądaniu @dictionaries są nagle zerowe. Skomentowałem cały inny kod w TranslationEnhancer, więc jestem absolutnie pewien, że cały moduł musi zostać przeładowany za każdym razem, gdy wykonuję żądanie.

Próbowałem przenieść moduł poza katalogiem lib (przeniesiono go do lib_unloadable), następnie próbowałem:

ActiveSupport::Dependencies.explicitly_unloadable_constants << "TranslationEnhancer" 

ale nie ponownie. Nie mam pojęcia, jak rozwiązać ten problem, proszę o pomoc.

Otrzymałem Ruby 1.9.2 @ Rails 3.1.rc4.

EDYCJA: Wiem, że mogę ustawić słowniki jako stałą. Ale chciałbym użyć TranslationEnhancer jako biblioteka - tak można używać go bez zmian w innym projekcie i zainstalowanie różnych katalogach, takich jak:

TranslationEnhancer.install! EnglishDirectory, FrenchDirectory 

Wartości te won'd zmianie w trakcie wykonywania, oni po prostu zmianę projekt do projektu.

+2

Cóż, to funkcja, a nie błąd :-) Nie mogłem się oprzeć, przepraszam za to. – mliebelt

+0

Dlaczego po prostu nie zdefiniujesz stałej wewnątrz initalizera w ten sposób, że byłbyś w stanie uzyskać do niej dostęp przez nazwę wszystkich aplikacji? Czy musisz zmienić wartość podczas całego okresu użytkowania aplikacji? –

+0

możesz zdefiniować stałą jako hasz i zmienić jej wartość treści, kiedy tylko potrzebujesz (wciąż szukasz lepszego rozwiązania) – apneadiving

Odpowiedz

5

Rozwiązany!

Zdałem sobie sprawę, że wszystkie pliki application.rb i environment.rb są ponownie ładowane wraz z wszystkimi innymi plikami. Jedyne, czego nie można przeładować, to inicjalizatory (config/initializers/*). Rozwiązaniem było przeniesienie inicjalizacji do application.rb.

0

@ słowniki nie jest "zmienną klasy". Jest to "zmienna instancji na poziomie klasy". Tutaj znajdziesz dodatkowe wyjaśnienie: Class and instance variables

Spróbuj użyć słowników @@.

+0

Interesujący artykuł, dzięki za wyjaśnienia. Niestety nie ma to związku z problemem. Wszystko ładuje się na każde żądanie, w tym zmienne instancji na poziomie klasy i zmienne klasy :( –

+0

Ah, to dziwne.Wiem, że Rails ma przeładowanie modeli, aby ułatwić łatwą/dynamiczną zmianę kodu w locie (bez konieczności ponownego uruchomienia serwera). opcja środowiska/config, która to umożliwia. Być może możesz przetestować te rzeczy w fazie rozwoju, wyłączając to. Będzie to oznaczać, że będziesz musiał restartować za każdym razem, gdy dokonasz zmiany kodu ...ale to może być dla ciebie do przyjęcia. –

+0

"config.cache_classes = false" nie wiesz, czy to pomoże - ale czy warto spróbować? –

Powiązane problemy