2010-10-23 6 views
12

Mam uaktualnienie mojej aplikacji Rails do pracy z Ruby 1.9 i trzymam błędy napotykają tak:Co naprawdę oznacza "moduły anonimowe bez nazwy, do których się odwołują"?

Anonymous modules have no name to be referenced by 
/home/foo/.gem/ruby/1.9.1/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:585:in `to_constant_name' 
/home/foo/.gem/ruby/1.9.1/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:391:in `qualified_name_for' 
/home/foo/.gem/ruby/1.9.1/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:104:in `rescue in const_missing' 
/home/foo/.gem/ruby/1.9.1/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:94:in `const_missing' 
/home/foo/app/config/environment.rb:66:in `block in <top (required)>' 
etc. 

Google wyszukuje wszystkie rodzaje trafień w odniesieniu do tego, ale każdy z nich odnosi się do konkretnej poprawki dla jednego konkretnego klejnot lub aplikacja. Żadne z nich nie wyjaśnia, co naprawdę oznacza komunikat.

  • Co to jest "moduł anonimowy"?
  • Skąd pochodzi ten komunikat o błędzie? (Sam interpreter Rubiego?)
  • Czym różni się Ruby 1.9, która to powoduje? (Rails 2.3.8 z Ruby 1.8.7 tego nie widzi.)
  • Jaki jest ogólny/poprawny sposób naprawienia tego błędu?

Linia 66 environment.rb jest konfiguracja dla super_exception_notifier (stara wersja 2.0.8):

ExceptionNotifier.configure_exception_notifier do |config| 
    config[:sender_address] = %("Foo" <[email protected]>) 
    config[:exception_recipients] = %w([email protected]) 
    config[:skip_local_notification] = false 
end 

Z tego co mogę powiedzieć, ExceptionNotifier jest niezdefiniowana, a ActiveSupport próbuje załadować magicznie to, ale zawiedzie, a następnie ponownie nie próbuje wydrukować ładnego komunikatu o błędzie.

+0

sprawdzanie kolizji nazw w nazwach metod/modułów w aplikacji z szynami. niejasne błędy często zdarzają się, gdy twoje dane kodu kolidują z AR. – glebm

Odpowiedz

6

Moduł anonimowy jest modułem, który jest zadeklarowany w taki sposób:

Fred = Module.new do 
    def meth1 
    "hello" 
    end 
    def meth2 
    "bye" 
    end 
end 

zamiast przy użyciu zwykłej składni Module mod_name <block>. Ponieważ nie mają nazwy modułu, nie można pobrać nazwy modułu. to_constant_name próbuje zadzwonić pod numer desc.name.blank?, gdzie desc jest modułem anonimowym (bez name).

Ten błąd pochodzi z modułu ActiveSupport, który może wskazywać na błąd w gem active_support lub może wskazywać, że jakiś inny fragment kodu używa ActiveSupport niepoprawnie. Sam komunikat o błędzie nie dostarcza wystarczającej ilości informacji, aby zidentyfikować winowajcę (przynajmniej dla mnie, kto ma więcej doświadczenia z szynami, może dostarczyć więcej informacji).

Bez znajomości obraźliwego kodu trudno jest dokładnie określić, dlaczego ten błąd pojawił się w wersji 1.9, lub co należy zrobić, aby to naprawić. Biorąc pod uwagę, że istnieje wiele niedopasowanych i niedopasowanych klejnotów, które nie zostały jeszcze zaktualizowane do wersji 1.9, podejrzewam, że ActiveSupport nie jest źródłem problemu. Uaktualnij wszystkie swoje klejnoty, które mają wersje kompatybilne z 1.9, a następnie spróbuj wyłączyć inne klejnoty po jednym na raz (jeśli możesz) i sprawdź, czy nadal pojawia się błąd.

Jeśli podasz listę innych klejnotów, których używasz, ktoś inny, kto może napotkał błąd wcześniej, może podać pewne szczegóły.

3

Może się to zdarzyć, jeśli spróbujesz w niewłaściwy sposób wykorzystać wewnętrzne klasy i moduły ActiveRecord. Miałem ten błąd wczoraj podczas pracy nad klejnotem, który rozszerza głębokie wewnętrzne działanie ActiveRecord. W końcu udało mi się obejść ten problem przez przeprojektowanie mojego kodu, który wykorzystuje wewnętrzne konteksty. Byłoby interesujące zobaczyć otaczające linie environment.rb:66 do dalszej analizy.

+0

Edytowane pytanie zawiera kod błędu. – ScottJ

0

Kiedy dostałem ten błąd, było to spowodowane błędną pisownicą podczas definiowania klasy. Jeśli otrzymujesz ten błąd, warto rozważyć definicje modułów i klas dla literówek.

+0

Trochę spóźniony na imprezę, wiem, ale inne odpowiedzi (choć informujące) tak naprawdę nie oferują porad dotyczących konkretnych przedmiotów, aby rozpocząć sprawdzenie. –

1

Może się to zdarzyć, gdy nazwa klasy nie jest zgodna z nazwą pliku, w moim przypadku był to plik o nazwie application.rb, który dotyczy klasy ApplicationController . Zmiana nazwy pliku na application_controller.rb rozwiązała problem.

Powiązane problemy