Bessere Fehlermeldungen in Rails
Log- und Fehlermeldungen können eine wichtige Quelle zum Erkennen von Problemen sein. Allerdings nur wenn die Meldungen aussagekräftig sind und man diese auch findet. Beim Entwickeln einer Rails-Anwendung stösst man häufig auf 2 Probleme:
- Die wichtigen Meldungen gehen in der Flut von Asset Pipeline Informationen unter.
- Die Fehlerseite zeigt einem nicht die gewünschten Informationen an.
Für beide Probleme gibt es einfache Lösungen, die einem mit geringem Aufwand viel Zeit sparen können.
Logmeldungen der Asset Pipeline abschalten
So lange man in der Development-Umgebung ist haben die vielen Meldungen der Asset Pipeline keinen grossen Nutzen. Sie sind einem viel mehr nur im Weg und verdecken die wichtigen Meldungen. Oder wer erkennt bei diesem einfachen Seitenaufruf das wirkliche Problem?
Started GET "/items" for 127.0.0.1 at 2013-01-20 14:46:02 +0100
Processing by ItemsController#index as HTML
Item Load (0.1ms) SELECT "items".* FROM "items"
Rendered items/index.html.erb within layouts/application (2.0ms)
Completed 200 OK in 83ms (Views: 36.7ms | ActiveRecord: 1.2ms)
[2013-01-20 14:46:02] WARN Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true
Started GET "/assets/application.css?body=1" for 127.0.0.1 at 2013-01-20 14:46:02 +0100
Served asset /application.css - 304 Not Modified (10ms)
[2013-01-20 14:46:02] WARN Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true
Started GET "/assets/jquery.js?body=1" for 127.0.0.1 at 2013-01-20 14:46:02 +0100
Served asset /jquery.js - 304 Not Modified (8ms)
[2013-01-20 14:46:02] WARN Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true
Started GET "/assets/jquery_ujs.js?body=1" for 127.0.0.1 at 2013-01-20 14:46:02 +0100
Served asset /jquery_ujs.js - 304 Not Modified (2ms)
[2013-01-20 14:46:02] WARN Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true
Started GET "/assets/items.css?body=1" for 127.0.0.1 at 2013-01-20 14:46:02 +0100
Served asset /items.css - 304 Not Modified (2ms)
[2013-01-20 14:46:02] WARN Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true
Started GET "/assets/scaffolds.css?body=1" for 127.0.0.1 at 2013-01-20 14:46:02 +0100
Served asset /scaffolds.css - 304 Not Modified (2ms)
[2013-01-20 14:46:02] WARN Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true
Started GET "/assets/items.js?body=1" for 127.0.0.1 at 2013-01-20 14:46:02 +0100
Served asset /items.js - 304 Not Modified (2ms)
[2013-01-20 14:46:02] WARN Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true
Started GET "/assets/application.js?body=1" for 127.0.0.1 at 2013-01-20 14:46:02 +0100
Served asset /application.js - 304 Not Modified (8ms)
[2013-01-20 14:46:02] WARN Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true
Das Gem Quiet Assets stoppt diese Meldungsflut. Dazu genügt es das Gemfile um diesen Eintrag zu erweitern:
Nach einem anschliessenden bundle
und einem Neustart mittels rails s
gibt der gleiche Seitenaufruf nur noch diese Meldungen aus:
Started GET "/items" for 127.0.0.1 at 2013-01-20 14:46:59 +0100
Connecting to database specified by database.yml
Processing by ItemsController#index as HTML
Item Load (0.1ms) SELECT "items".* FROM "items"
Rendered items/index.html.erb within layouts/application (1.9ms)
Completed 200 OK in 83ms (Views: 54.3ms | ActiveRecord: 1.2ms)
[2013-01-20 14:46:59] WARN Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true
[2013-01-20 14:46:59] WARN Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true
[2013-01-20 14:46:59] WARN Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true
[2013-01-20 14:46:59] WARN Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true
[2013-01-20 14:46:59] WARN Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true
[2013-01-20 14:46:59] WARN Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true
[2013-01-20 14:46:59] WARN Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true
[2013-01-20 14:46:59] WARN Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true
Nun sieht man auf den ersten Blick die Meldungen zu „content-length“ und kann dem nachgehen.
Bessere Fehlermeldungen
Beim Entwickeln passieren einem immer mal wieder Fehler. Leider hilft einem die mit Rails ausgelieferte Fehlerseite oft nicht wirklich weiter:
Das Gem Better Errors ersetzt diese Seite und liefert einem viele hilfreiche Zusatzinformationen. Die Installation erfolgt wie immer über einen Eintrag ins Gemfile:
Nach dem Speichern ist auch hier bundle
auszuführen bevor man mit rails s
wiederum den Webserver neu startet. Der Aufruf der gleichen Seite führt nun zu dieser Ausgabe:
Die Fehlermeldung findet sich nun im schwarzen Balken am Seitenanfang. Zusätzlich wird die Stelle im Code angezeigt bei der das Problem aufgetreten ist. Fürs Auffinden von Problemen sind die aufgelisteten Request Parameter oft äusserst hilfreich – vor allem wenn die von einem Formular übermittelten Daten nicht gefunden werden können.
Aufräumen
Wenn man die beiden Gems oft zusammen braucht kann man diese in einer einzigen Gruppe zusammenfassen. Statt den beiden oben gezeigten Varianten sieht der Eintrag im Gemfile dann so aus:
Fazit
Die beiden Gems Quiet Assets und Better Errors finde ich mittlerweile unverzichtbar für die Entwicklung von Rails-Anwendungen. Ohne lange zu suchen gleich den richtigen Code-Ausschnitt zu sehen hilft mir die Fehlersuche deutlich zu beschleunigen. Und kann man die Warnungen bereits in der Entwicklung erkennen muss man die Fehler nicht erst in der Produktionsumgebung suchen.