#402 Better Errors & RailsPanel
- Download:
- source codeProject Files in Zip (64.3 KB)
- mp4Full Size H.264 Video (22.1 MB)
- m4vSmaller H.264 Video (11.1 MB)
- webmFull Size VP8 Video (13 MB)
- ogvFull Size Theora Video (28.2 MB)
translated by Paweł Lenart
W tym odcinku przyjrzymy się kilku narzędziom, które pomogą w rozwoju aplikacji. Do zademonstrowania użyjemy aplikacji w Rails do zarządzania projektami. Strona wyświetla listę prac w projektach, ale po kliknięciu w link pojedynczego projektu dostajemy komunikat błędu.
Wygląda na to, że mamy niezdefiniowaną metodę empty?
wywoływaną na rzecz obiektu nil
. Na stronie błędu nie widać, w którym miejscu metoda emty?
jest wywoływana, natomiast stronę tę można ulepszyć by lepiej wskazywała umiejscowienie błędu.
Użycie Better Errors
To prowadzi nas do pierwszego narzędzia, które zostanie zaprezentowane w tym odcinku: Better Errors. Narzędzie to czyni strony błędów o wiele bardziej funkcjonalnymi i również lepiej wyglądającymi. Wypróbujmy je w naszej aplikacji.
Kiedy dodajemy ten gem do aplikacji, ważnym jest, aby umieścić je w grupie development
w celu uniknięcia pokazania szczegółów naszych błędów w środowisku produkcyjnym. Po dodaniu gemu należy, jak zwykle, wywołać bundle
, aby go zainstalować.
group :development do gem 'better_errors' end
Po restarcie serwera i przeładowaniu strony Better Errors obsłuży błąd i zobaczymy dokładnie, w którym miejscu on wystąpił.
Stosowny kod źródłowy jest teraz ładnie podświetlony i możemy zobaczyć metodę empty?
, która powoduje problemy. Powyżej kodu umiejscowiony jest stos wywołań, a po kliknięciu na jego którąkolwiek linię pokazany zostanie kod wywoływany w danym miejscu stosu. Możemy również zajrzeć do całej aplikacji Rails i podejrzeć źródło dowolnej części Rails lub dowolnego gema, który jest na stosie wywołań.
Przydatnym efektem ubocznym jest możliwość lepszego zrozumienia działania aplikacji Rails. W naszym błędzie możemy zobaczyć, że w kodzie wywoływana jest metoda check_box
, a następnie możemy prześledzić każdy krok wywołań poprzez form builder, żeby lepiej zrozumieć, co się dzieje. Na dole strony widnieje informacja na temat żądania włączając w to ciasteczka, które są używane. To nie wszystko, co to narzędzie potrafi. Jeśli spojrzeć na stronę błędu, to można zauważyć wskazówkę mówiącą o dodaniu gemu binding_of_caller
, który rozszerza funkcjonalność. Spróbujmy to zrobić. Ponownie, ten gem powinien znaleźć się w grupie development
i następnie powinien zostać wywołany bundle
.
group :development do gem 'better_errors' gem 'binding_of_caller' end
Należy się upewnić, że znajdujemy się w bezpiecznej sieci, ponieważ dostęp niepowołanych użytkowników do Twojej aplikacji Rails w ten sposób jest wysoce niepożądany. Zrestartowanie aplikacji i przeładowanie strony pokaże nam o wiele więcej informacji, włączając w to zmienne lokalne i zmienne instancji.
Działa to dla każdej linii stosu wywołań, więc możemy podejrzeć zmienne lokalne i zmienne instancji dla każdej z nich. Jest to bardzo przydatne, jednakże najlepszą cechą narzędzia jest wbudowana interaktywna konsola, która może być również użyta w dowolnym punkcie stosu wywołań. Jeżeli użyjemy jej do sprawdzenia modelu Task, zobaczymy, że wartość completed_at
to nil
, co powoduje rzucenie wyjątku, kiedy wywołujemy metodę empty?
.
Zamiast empty?
powinniśmy użyć metody present?
i w tym celu możemy kliknąć w nazwę pliku, co spowoduje jego otwarcie w edytorze. Tutaj zrobimy szybką zmianę, ale w prawdziwej aplikacji należy najpierw stworzyć test, który się nie wykonuje, żeby się upewnić, że błąd zostanie poprawiony i nie będzie powtarzalny.
Użycie Better Errors wraz z żądaniami AJAX
Nasza aplikacja ma jeszcze jeden bug. Jeśli oznaczymy zadanie, jako wykonane poprzez zaznaczenie checkboksa, to powinno ono być automatycznie przesunięte do sekcji “Completed Tasks”, a jego rekord w bazie danych powinien zostać zaktualizowany - to wszystko poprzez żądanie AJAX. Jednakże, jeśli to zrobimy, to zadanie nie jest przenoszone i jeśli spojrzeć w log deweloperski, to można zobaczyć, że podczas wykonywania żądania AJAX rzucany jest wyjątek. Byłoby o wiele lepiej móc zobaczyć ten wyjątek używając Better Errors i można tego dokonać używając ścieżki /__better_errors
.
To pokazuje nam ostatnie wystąpienie wyjątku i zgadza się z logiem deweloperskim. Po użyciu konsoli w celu wyświetlenia wartości zmiennej można zauważyć, że jest to łańcuch znaków zawierający wartość “1”. To tłumaczy, dlaczego dostajemy wyjątek podczas wywołania metody zero?
na tej zmiennej - należy skonwertować ją najpierw na liczbę. Ponownie, można otworzyć plik klikając na link z nazwą i poprawić ten błąd. Teraz, kiedy zaznaczymy zadanie, jako ukończone, to poprawnie jest przenoszone do listy poniżej.
Zanim skończymy się przyglądać Better Errors należałoby wspomnieć o kilku rzeczach odnośnie linku, który otwiera plik w edytorze. Działa to również z wewnętrznymi plikami gemów, więc jeśli chcemy spojrzeć jak działa, powiedzmy, assign_attributes
w ActiveRecord, to możemy kliknąć w link tak samo, jak odbywałoby się to w przypadku pliku z naszego kodu źródłowego. Jeżeli chcemy zmienić edytor, który jest uruchamiany przez Better Errors, to możemy to zrobić poprzez utworzenie nowego initializera w naszej aplikacji i odpowiednie ustawienie właściwości BetterErrors.editor
.
BetterErrors.editor = :sublime if defined? BetterErrors
Istnieje kilka innych ustawień, jak na przykład :sublime
dla edytora Sublime Text. Należy zauważyć, że sprawdzane jest, czy BetterErrors
jest zdefiniowane. Na RDocs jest więcej informacji na ten temat i można użyć nawet obiektu proc, jeżeli zajdzie taka potrzeba.
Rails Panel
Innym narzędziem, na jakie spojrzymy jest Rails Panel. Jest to rozszerzenie dla przeglądarki Chrome, które dodaje log deweloperski dostępny bezpośrednio z poziomu przeglądarki. Jest ono dostępne w Chrome Web Store, jednakże wymaga użycia gemu Meta Request w aplikacji. Gem powinien trafić do grupy development
, a następnie należy wykonać bundle
w celu jego instalacji.
group :development do gem 'better_errors' gem 'binding_of_caller' gem 'meta_request' end
Po zainstalowaniu gemu i restarcie aplikacji możemy otworzyć narzędzia deweloperskie w Chrome i powinna w nich widnieć nowa zakładka RailsPanel. Wraz z odwiedzaniem kolejnych stron w aplikacji powinniśmy widzieć pozycje odnoszące się do każdej z nich. Działa to również dla żądań AJAX.
Panel zawiera zestaw różnych informacji na temat żądania, włączając w to format, czas wykonania, parametry, zapytania do bazy danych i wyrenderowane widoki. Tak jak w przypadku Better Errors, można kliknąć w widok, żeby otworzyć go w edytorze. W celu zmiany edytora należy otworzyć preferencje Chrome"a i można wybrać spośród TextMate, MacVim lub Sublime Text.
Jest to w miarę proste, lecz bardzo użyteczne narzędzie, ponieważ dostarcza wszystkich informacji bezpośrednio w przeglądarce bez zmuszania do patrzenia w logi.