O'Reilly logo

Rails Kochbuch by Rob Orsini

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

First
|
353
Max.
Linie
Max.
Linie
Kapitel 10
KAPITEL 10
Debugging von Rails-Anwendungen
10.0 Einführung
Bugs sind für alle Softwareprojekte eine unveränderliche Tatsache. Ein Bug ist ein Fehler
in einem Softwaresystem, durch den die Ausführung der Software nicht das ergibt, was
erwartet wird (oder vielleicht, was der Kunde erwartet). Bugs können so offensichtlich wie
z.B. eine fehlerhafte Syntax sein, oder aber schwer nachvollziehbar und scheinbar nicht
aufzuspüren. Bugs treten häufig zutage, wenn Software unerwartete Eingaben empfängt
oder wenn sie in einer Umgebung ausgeführt wird, die von den Entwicklern ursprünglich
nicht vorgesehen war.
Debugging ist der Vorgang des Aufspürens und Behebens von Bugs. Erfahrene Entwickler
geben zu, dass es Bugs gibt, und erlernen eine Reihe von Fähigkeiten, die deren Behebung
vereinfachen. Die Suche nach Bugs kann lohnend und unterhaltsam sein: Sie kann das
Überdenken der Programmlogik verlangen oder kreative Methoden zutage fördern, um
den Bug freizulegen. Wenn aber ein Bug wieder auftaucht, von dem Sie ganz sicher waren,
ihn eliminiert zu haben, dann wird aus dem Spaß schnell Frustration. Und was einige
Anwender als Bugs melden, kann sich ebenso gut als angefordertes Feature herausstellen.
Sich mit Ihren Kunden über den Unterschied zwischen einem Bug und einem Feature zu
verständigen kann man ebenfalls als einen Teil des Debuggings betrachten.
Wenn Bugs von Anwendern gemeldet werden, besteht die erste Herausforderung häufig
darin, den Fehler zu reproduzieren. Das Reproduzieren eines Fehlers klingt einfach, aber
oft wird damit sehr viel Debugging-Zeit verbracht. Der Rest der Debugging-Bemühungen
wird damit zugebracht, die Syntax oder Logik zu korrigieren, die den Bug verursacht hat.
Rails unterstützt Sie beim Kampf gegen Bugs zuerst dadurch, dass es sicherstellt, dass sie
gar nicht erst auftreten (oder zumindest nur einmal). Zu diesem Zweck stellt es seine
robusten automatisierten Testeinrichtungen zur Verfügung. Zum Zweiten vereinfacht
Rails die Isolation von Bugs, indem es eine komponentenbasierte Architektur fördert, bei
der logisch zusammengehörende Teile Ihrer Anwendung von anderen Teilen getrennt
sind. Schließlich stellt Rails den Entwicklern eine Reihe sehr leistungsfähiger Werkzeuge
00____RailsKochbuch.book Seite 353 Dienstag, 3. Juli 2007 8:13 08
Max.
Linie
Max.
Linie
354
|
Kapitel 10: Debugging von Rails-Anwendungen
Links
zur Verfügung, die Sie dabei unterstützen, die innere Arbeitsweise Ihrer Anwendung zu
untersuchen, so dass Bugs schnell entdeckt und korrigiert werden können. In diesem
Kapitel sehen wir uns die Tools und Techniken an, die den Bugs in Rails nur ein sehr kur-
zes Leben gewähren.
10.1 Rails über die Konsole untersuchen
Problem
Sie wollen Ihre Rails-Anwendung debuggen, indem Sie Objekte und deren Methoden
interaktiv untersuchen. Sie wollen darüber hinaus in der Lage sein, Ruby-Code in Echtzeit
zu erzeugen und auszuführen, während Sie die Interna der Anwendung untersuchen (und
den Fehler hoffentlich beheben).
Lösung
Verwenden Sie die Rails-Konsole, um in das Innere Ihrer Anwendung einzutauchen und
sie zu debuggen, oder einfach nur, um zu sehen, wie die Dinge funktionieren. Aus dem
Root-Verzeichnis Ihrer Anwendung starten Sie eine Console-Session mit:
$ ./script/console
Sobald der Console-Prompt erscheint, können Sie Modellobjekte instanziieren, die Bezie-
hung von Objekten untersuchen und Objektmethoden erkunden. In unserer beispielhaf-
ten Kochbuch-Anwendung können Sie ein neues
Chapter-Objekt erzeugen und dessen
Eigenschaften wie etwa den Titel untersuchen. Sie können sich die mit dem Objekt ver-
knüpften Recipes-Objekte und den Titel jedes verknüpften Recipe-Objekts zurückgeben
lassen:
$ ./script/console
Loading development environment.
>> c = Chapter.find(1)
=> #<Chapter:0x14a5bf8 @attributes={"sort_order"=>"1",
"title"=>"Cooking Chicken", "id"=>"1"}>
>> c.title=> "Cooking Chicken"
>> c.recipes
=> [#<Recipe:0x13f4b50 @attributes={"sort_order"=>"1",
"body"=>"fire it up...", "title"=>"BBQ Chicken", "id"=>"1",
"chapter_id"=>"1"}>, #<Recipe:0x13f4ac4 @attributes={"sort_order"=>"2",
"body"=>"pre-heat to 400...", "title"=>"Oven Roasted", "id"=>"2",
"chapter_id"=>"1"}>, #<Recipe:0x13f4704 @attributes={"sort_order"=>"3",
"body"=>"health warning: ...", "title"=>"Deep Fried", "id"=>"3",
"chapter_id"=>"1"}>]
>> c.recipes.map {|r| r.title}
=> ["BBQ Chicken", "Oven Roasted", "Deep Fried"]
00____RailsKochbuch.book Seite 354 Dienstag, 3. Juli 2007 8:13 08
Max.
Linie
Max.
Linie
10.1 Rails über die Konsole untersuchen
|
355
Rechts
Vielleicht debuggen Sie einen NoMethodError, der auftaucht, wenn Sie sich die Kapitelliste
in einem Browser ansehen. Die ASCII-Version der HTML-Fehlermeldung könnte etwa so
aussehen:
NoMethodError in Chapters#list
Showing app/views/chapters/list.rhtml where line #5 raised:
undefined method `find_fried_recipe_titles' for Chapter:Class
Extracted source (around line #5):
2:
3: Frying Recipes:
4: <ul>
5: <% Chapter.find_fried_recipe_titles.each do |t| %>
6: <li><%= t %></li>
7: <% end %>
8: </ul>
...
Diese Fehlermeldung sagt Ihnen, dass Ihre Anwendung versucht, eine Klassenmethode
namens
find_fried_recipe_titles aufzurufen, die scheinbar nicht definiert ist. Sie kön-
nen das überprüfen, indem Sie versuchen, die Methode über Ihre Console-Session aufzu-
rufen:
>> Chapter.find_fried_recipe_titles
NoMethodError: undefined method 'find_fried_recipe_titles'
for Chapter:Class from
/usr/local/lib/ruby/gems/1.8/gems/activerecord-1.14.2/lib/
active_record/base.rb:1129:in
'method_missing'
from (irb):2
Offensichtlich ist die Methode nicht definiert, vielleicht weil Sie vergessen haben, sie zu
implementieren. Sie könnten das nachholen, indem Sie die Methodendefinition gleich in
die
Chapter-Modellklasse einfügen, aber wir wollen sie zuerst in der Console codieren. Sie
entwickeln den folgenden Code, der als Kern der
find_fried_recipe_titles-Methode die-
nen könnte:
>> Chapter.find(:all, :include => :recipes).map {|c| c.recipes.map{|r| r \
?> if r.title =~ /fried/i}}.flatten.compact.collect {|r| r.title}
=> ["Deep Fried", "Fried Zucchini"]
Sobald Sie mit der Implementierung zufrieden sind, mit der Sie in der Console herumge-
spielt haben, können Sie eine bereinigte Version der Methode in Ihre
Chapter-Modellklas-
sen-Definition einfügen, und zwar innerhalb der Definition für die Klassenmethode
self.
find_fried_recipe_titles
.
app/models/chapter.rb:
class Chapter < ActiveRecord::Base
has_many :recipes
00____RailsKochbuch.book Seite 355 Dienstag, 3. Juli 2007 8:13 08

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required