2009-08-07 10 views
17

Gdy dwa jednoczesnych żądań HTTP do mojego app Rails, drugi zawsze zwraca następujący błąd:Kopia ApplicationController została usunięta z drzewa modułu, ale nadal jest aktywny

A copy of ApplicationController has been removed from the module tree but is still active!

Stamtąd Daje nieprzydatny ślad stosu do skutku „przeszliśmy standardowego materiału serwerze, prowadził swój pierwszy before_filter na ApplicationController (i sprawdziłem, to po prostu dowolny filtr działa pierwszy)”, a następnie oferuje następujące możliwości:

/home/matchu/rails/torch/vendor/rails/activesupport/lib/active_support/dependencies.rb:414:in `load_missing_constant'

/home/matchu/rails/torch/vendor/rails/activesupport/lib/active_support/dependencies.rb:96:in `const_missing'

, który zakładam, jest ogólną odpowiedzią i nie mówi zbyt wiele.

Google wydaje mi się, że ludzie, którzy tworzą silniki Railsowe, napotkają to, ale ja tego nie robię. Wszystko, co zrobiłem, to uaktualnić moją aplikację Railsową z wersji 2.2 (2.1?) Do wersji 2.3.

Jakie są możliwe przyczyny tego błędu i jak mogę go śledzić, co naprawdę się dzieje? Wiem, że to pytanie jest niejasne, więc czy inne informacje będą pomocne?

Co ważniejsze: Próbowałem przeprowadzić test w środowisku "produkcyjnym" właśnie teraz, a błąd nie wydaje się utrzymywać. Czy to ma wpływ tylko na rozwój i czy nie muszę się zbytnio martwić?

Odpowiedz

8

jest to błąd w Rails 2.3.3:

re jest poprawka dla niej (ale niekompletny?) w 2-3-stabilny

Masz kilka możliwości rozwiązania problemu:

  • przywrócić Rails 2.3.2, poczekaj na 2.3.4, prawdopodobnie pod koniec sierpnia. 2.3.3 ma kilka złych problemów, więc może być najlepiej.
  • Problem nie powinien występować w trybie produkcyjnym, ani nie może się zdarzyć w trybie programowania pod serwerem Thin. Jeśli masz ten problem w Google Engines w trybie produkcji, łatka jest jedyną nadzieją. Jeśli jest to tylko tryb deweloperski, możesz po prostu uruchomić swój lokalny serwer za pomocą Thin zamiast Mongrel.
  • Jeśli to Google Engines, możesz odłączyć się od Google Engines i hostować swoją aplikację w inny sposób. Wydaje się, że to dużo pracy.

Powodzenia, to naprawdę zły błąd, na który napotyka wiele osób.

+0

Oh wow, dobrze wiedzieć, że to nie ja. Myślę, że po prostu usiądę i poczekam, ponieważ ta aplikacja zostanie wdrożona za mniej więcej miesiąc, ale nawet jeśli nie jest dostępna, to tylko aktualizacja Dziękuję za poinformowanie mnie, że nie jestem jedyny! – Matchu

+1

Używanie albo WEBrick albo Thin server lub Mongrel nie rozwiąże problemu .. Wypróbowałem wszystkie trzy serwery, ale wciąż istnieje problem –

+0

Shree Wiem, że unikałem kundel był zalecaną poprawką i działał dla kilku osób, które znam, czy jesteś na Railsach 2.3.3? Jesteś pewien, że to ten sam problem? – mixonic

0

Dziwne.

Próbujesz uruchomić "rake rails: update", aby upewnić się, że konfiguracje są skryptami są aktualne. Może być konieczne sprawdzenie istniejących w aplikacji szablonu.

+0

Brak wyjścia na zadaniu natarcia =/ – Matchu

+0

Cholera. Nigdy wcześniej tego nie widziałem i widzę, co masz na myśli mówiąc o silnikach powodujących błąd. Mam nadzieję, że ktoś inny może ci pomóc. Przepraszam :( – askegg

0

Miałem ten błąd iz pamięci było jedną z tych trzech rzeczy, które ją naprawiły.

1) Musiałem zaktualizować kundel/stelaż 2) Miałem zmienną środowiskową ze spokojnego uwierzytelniania, które przeniosłem do pliku production.rb i development.rb z environment.rb - przesuwając go z powrotem do środowiska. rb wydawało się pomóc 3) will_paginate był nieaktualny

1

I dodatek do obejścia wymienionych w innych odpowiedzi, ja spotkałem dwóch innych:

  1. Add "config.cache_classes = false" do środowisk config/pliku/development.rb. Ma to niefortunny skutek uboczny, wymagający ponownego uruchomienia serwera, gdy chcesz zobaczyć wprowadzone zmiany.
  2. Dodaj "nie doładowania" wewnątrz klas kontrolerów w swoim silniku. Zobacz http://strd6.com/?p=250 i http://dev.rubyonrails.org/ticket/6001

nie próbowałem drugie podejście, ponieważ znalazłem inne rozwiązanie pierwsze, ale jest oczywiście kompromis pomiędzy unikając konieczności edytowania kodu wtyczki, która może zostać cofnięte, jeżeli nowsza wersja wtyczki jest pobierana, a następnie łatwość rozwoju zapewniana przez brak konieczności ponownego uruchamiania serwera programistycznego przez cały czas w drugim rozwiązaniu.

1

Mam do czynienia z tym samym problemem dla mojego nowego silnika na szynach 2.3.4 i znalazłem rozwiązanie here.

Wywołanie metody unloadable rozwiązało mój problem.

0

Wywołaliśmy do modelu activerecord w module o podanej nazwie, który zastępuje metodę "name". Rails oczekuje, że metoda name zwróci Product :: Categories :: MilkProducts :: Firstproduct, ale dostanie tylko Firstproduct i zgłasza błąd. Więc jeśli pojawi się ten błąd, najpierw sprawdź, czy przedefiniowałeś self.name.

  • Firstproduct.method (: name) .owner powinien być moduł
  • Firstproduct.method (: name) .source_location

źródło:

module Product::Categories::MilkProducts 
    class Base 
    def self.name 
     self.to_s.demodulize 
    end 
    end 
    class Firstproduct < Base 
    self.product = Product.first 
    end 
end