Ponieważ jest to mój pierwszy post - na wstępie witam wszystkich.
Mój problem jest następujący - wczoraj rozpocząłem przygodę z Haml (w Railsach programuje od roku). Ten system szablonowy jest zaiste bardzo ładny i można szybko się go nauczyć, ale natrafiłem na jeden poważny problem, który właściwie go dyskwalifikuje - w przypadku wystąpienia wyjątku, nie jest wyświetlany StackTrace. Czasem nawet żaden komunikat się nie pojawia, tylko pusta strona.
Nie wiem, czy to specyfika Haml’a, czy coś jest nie tak z moimi Railsami. W każdym razie w Rhtml wszystkie wyjątki są pięknie prezentowane (oczywiście w trybie development).
Jeśli chodzi o szczegóły konfiguracji, to używam Rails 1.2.3 oraz Haml 1.7.1
Wygląda na to, że coś jednak jest nie tak z Railsami - kiedy w pliku konfiguracyjnym
wybieram wcześniejszą wersję railsów (RAILS_GEM_VERSION = ‘1.1.6’), to błędy
wyświetlane są całkiem sensownie (tzn. razem ze StackTracem, fragmentem kodu, w którym
prawdopodobnie wystąpił błąd, etc.).
Dodam, że projekt, w którym pojawia się ten problem, był tworzony w Railsach 1.1.6, a teraz chcę go przenieść do 1.2.3 - może gdzieś w konfiguracji coś jest nie tak?
Też o tym pomyślałem Założyłem nowy projekt i w nim wszystko wydaje się działać poprawnie.
Błąd zatem musi być albo w którymś z plików wygenerowanych przez poprzednią wersję railsów albo w jakimś pluginie (poza hamlem używam acts_as_rateable, acts_as_sluggable, file_column, login_system oraz ym4r_gm). Niektóre z nich nieco nieświeże - może powinienem zrobić jakiś update.
Jeśli macie jakieś dalsze sugestie, to będę wdzięczny. Tak, czy owak - dzięki za wsparcie
Raczej to jedna z tych sytuacji, w której sam musisz znaleźć powód błędu (jest na tyle nietypowa, że mało prawdopodobne by ktoś inny spotkał się z tym wcześniej). Ja bym zrobił tak:
-założyć nowy projekt w railsach (już na nowej wersji 1.2.3), zainstalować plugin haml
(sprawdzamy czy stack trace działa…)
-skopiowanie konfiguracji (environment.rb itp)
(sprawdzamy czy stack trace działa…)
-kontrolery, modele, baza, /lib
(sprawdzamy czy stack trace działa…)
-pluginy (bardzo duża szansa że to właśnie przez nie nie działa)
(sprawdzamy czy stack trace działa…)
Generalnie musisz to rozbić na kroki, każdy z nich stanowiący jakąś logiczną całość. Działaj i raportuj z frontu ;).
Bingo - błąd tkwił w config.rb. Dzięki za pomocne sugestie - zmotywowały mnie do pracy przez weekend.
A sam błąd jest odległy od Hamla o całe lata świetlne i jest chyba też ważną przestrogą,
dla osób modyfikujących wbudowane klasy… przynajmniej ja trzy razy zastanowię się nad
tym, zanim to zrobię następnym razem.
Konkretnie - w config.rb miałem 5 niewinnych linijek:
class Array
def sum
inject(0) { |n, value| n + value }
end
end
Railsy 1.1.6 nie rozszerzały klasy Array o metodę sum, więc sam ją sobie dodałem. Nie wiedziałem, że została ona dodana w ActiveSupport Railsów 1.2.3 do modułu Enumerable. Moja implementacja gryzła się niestety z implementacją Railsów:
def sum(identity = 0, &block)
return identity unless size > 0
if block_given?
map(&block).sum
else
inject { |sum, element| sum + element }
end
end
która najwyraźniej wykorzystywana jest przy wyświetlaniu Stack Trace’a. Kto by pomyślał…