Zum Inhalt

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:

  1. Die wichtigen Meldungen gehen in der Flut von Asset Pipeline Informationen unter.
  2. 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:

gem 'quiet\_assets', :group => :development

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:

Rails Fehlerseite

Das Gem Better Errors ersetzt diese Seite und liefert einem viele hilfreiche Zusatzinformationen. Die Installation erfolgt wie immer über einen Eintrag ins Gemfile:

gem 'better_errors', :group => :development

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:

Better Error Fehlermeldung

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:

group :development do
  gem 'quiet_assets'
  gem 'better_errors'
end
 

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.