Ruby on Rails
Debuggen
Suche…
Debuggen der Rails-Anwendung
Um eine Anwendung debuggen zu können, ist es sehr wichtig, den Ablauf der Logik und der Daten einer Anwendung zu verstehen. Es hilft bei der Behebung logischer Fehler und erhöht die Programmierkenntnisse und die Codequalität. Zwei beliebte Edelsteine zum Debuggen sind der Debugger (für Ruby 1.9.2 und 1.9.3) und Byebug (für Ruby> = 2.x).
.rb
, um .rb
Dateien zu debuggen:
- Fügen
byebug
derdevelopment
vonGemfile
debugger
oderbyebug
Gemfile
- Führen Sie die
bundle install
- Fügen
byebug
als Haltepunktdebugger
oderbyebug
- Führen Sie den Code aus oder stellen Sie eine Anfrage
- Das Rail-Serverprotokoll wird am angegebenen Haltepunkt angehalten
- An diesem Punkt können Sie Ihr Serverterminal wie eine
rails console
und die Werte von Variablen und Parametern überprüfen - Um zur nächsten Anweisung zu gelangen, geben Sie
next
und drücken Sie dieenter
- Geben Sie
c
und drücken Sie dieenter
Wenn Sie .html.erb
Dateien debuggen .html.erb
, wird der Haltepunkt als <% debugger %>
hinzugefügt
Debuggen in Ihrer IDE
Jede gute IDE bietet eine grafische Benutzeroberfläche für das interaktive Debuggen von Ruby-Anwendungen (und damit auch von Rails-Anwendungen), in der Sie Haltepunkte hinzufügen, überwachen und bei Ausnahmebedingungen automatisch pausieren können. Außerdem können Sie die Codeausführung Schritt für Schritt und Zeile für Zeile verfolgen.
Sehen Sie sich beispielsweise eine der besten Ruby-IDEs an, die Debugging-Funktionen von RubyMine
Schnelles Debuggen von Ruby on Rails + Beratung für Anfänger
Das Debuggen durch Auslösen von Ausnahmen ist viel einfacher als das Schielen durch print
Bei den meisten Fehlern ist es byebug
viel schneller als das Öffnen eines irb-Debuggers wie pry
oder byebug
. Diese Tools sollten nicht der erste Schritt sein.
Ruby / Rails schnell debuggen:
1. Fast-Methode: Dann eine Exception
.inspect
und das Ergebnis .inspect
Der schnellste Weg zum Debuggen von Ruby-Code (insbesondere von Rails-Code) besteht darin raise
eine Ausnahme entlang des Ausführungspfads Ihres Codes .inspect
während .inspect
für die Methode oder das Objekt (z. B. foo
) .inspect
:
raise foo.inspect
Im obigen Code löst raise
eine Exception
, die die Ausführung Ihres Codes .inspect
, und gibt eine Fehlermeldung aus, die zweckmäßigerweise Informationen über das Objekt / die Methode (dh foo
) in der Zeile enthält, die Sie debuggen möchten.
Diese Technik ist nützlich, um ein Objekt oder eine Methode schnell zu untersuchen ( z. B. ist es nil
? ) Und sofort zu bestätigen, ob eine Codezeile überhaupt innerhalb eines gegebenen Kontextes ausgeführt wird.
2. Fallback: Verwenden Sie einen Rubin- IRB- Debugger wie byebug
oder pry
Erst nachdem Sie Informationen über den Status des Codeausführungsablaufs erhalten haben, sollten Sie in Erwägung ziehen, zu einem Ruby-Edelstein-Debugger wie pry
oder byebug
in dem Sie tiefer in den Status von Objekten innerhalb Ihres Ausführungspfads byebug
können.
So verwenden Sie den byebug
Edelstein zum Debuggen in Rails:
- Fügen Sie den
gem 'byebug'
innerhalb der Entwicklungsgruppe in Ihrem Gemfile hinzu - Führen Sie die
bundle install
-
byebug
die Phrasebyebug
in den Ausführungspfad des Codes ein, den Sie untersuchen möchten.
byebug
diese byebug
Variable ausgeführt wird, wird eine Ruby-IRB-Sitzung Ihres Codes geöffnet, sodass Sie direkt auf den Status der Objekte zugreifen können, wie sie sich zu diesem Zeitpunkt in der Ausführung des Codes befinden.
IRB-Debugger wie Byebug sind nützlich, um den Status Ihres Codes bei der Ausführung genau zu analysieren. Sie sind jedoch zeitaufwändiger als das Erheben von Fehlern. Daher sollten sie in den meisten Situationen nicht der erste Schritt sein.
Allgemeine Anfängerhinweise
Wenn Sie versuchen, ein Problem zu debuggen, sollten Sie immer folgendes tun : Lesen Sie die! @ # $ Ing-Fehlermeldung (RTFM).
Das bedeutet, dass Sie die Fehlermeldungen sorgfältig und vollständig lesen, bevor Sie handeln, damit Sie verstehen, was Sie zu sagen versuchen. Stellen Sie beim Debuggen beim Lesen einer Fehlermeldung die folgenden mentalen Fragen in dieser Reihenfolge :
- Welche Klasse bezieht sich der Fehler? (dh ich habe die richtige Objektklasse oder ist mein Objekt gleich
nil
? ) - Welche Methode bezieht sich der Fehler? (dh ist ihr Typ in der Methode; kann ich diese Methode für diesen Objekttyp / diese Objektklasse aufrufen? )
- Schließlich, was ich aus meinen letzten beiden Fragen entnehmen kann, welche Codezeilen sollte ich untersuchen? (Denken Sie daran: Die letzte Codezeile in der Stack-Ablaufverfolgung muss nicht unbedingt das Problem sein.)
Achten Sie im Stack-Trace besonders auf Codezeilen, die aus Ihrem Projekt stammen (z. B. Zeilen, die mit app/...
wenn Sie Rails verwenden). In 99% der Fälle liegt das Problem bei Ihrem eigenen Code.
Um zu veranschaulichen, warum Dolmetschen in dieser Reihenfolge wichtig ist ...
ZB eine Ruby-Fehlermeldung, die viele Anfänger verwirrt:
Sie führen Code aus, der zu einem bestimmten Zeitpunkt als solcher ausgeführt wird:
@foo = Foo.new
...
@foo.bar
und Sie erhalten einen Fehler, der besagt:
undefined method "bar" for Nil:nilClass
Anfänger sehen diesen Fehler und denken , das Problem ist , dass die Methode bar
ist nicht definiert. Es ist nicht. In diesem Fehler ist der Realteil, auf den es ankommt, Folgendes:
for Nil:nilClass
for Nil:nilClass
bedeutet, dass @foo
ist! @foo
ist keine Foo
Instanzvariable! Sie haben ein Objekt, das Nil
. Wenn dieser Fehler auftritt, ist es einfach rubin versuchen , Ihnen zu sagen , dass die Methode bar
nicht für Objekte der Klasse existiert Nil
. (na ja, da wir versuchen, eine Methode für ein Objekt der Klasse Foo
nicht Nil
).
Aufgrund dieses Fehlers ( undefined method "bar" for Nil:nilClass
) ist es undefined method "bar" for Nil:nilClass
leicht zu undefined method "bar" for Nil:nilClass
, dass dieser Fehler damit zusammenhängt, dass der bar
undefined
. Wenn dieser Fehler nicht sorgfältig gelesen wird, fangen die Anfänger fälschlicherweise an, die Details der bar
Methode auf Foo
, wobei der Teil des Fehlers, der darauf hinweist, dass das Objekt die falsche Klasse ist (in diesem Fall: nil), völlig fehlt. Es ist ein Fehler, der durch das Lesen von Fehlermeldungen vollständig vermieden werden kann.
Zusammenfassung:
Lesen Sie immer sorgfältig die gesamte Fehlermeldung, bevor Sie mit dem Debuggen beginnen. Das bedeutet: Immer den Klassentyp eines Objekts in einer Fehlermeldung überprüfen Sie zuerst, dann seine Methoden, bevor Sie sleuthing in jede Stacktrace oder Codezeile beginnen , wo Sie den Fehler denken auftreten kann. Diese 5 Sekunden können Ihnen 5 Stunden Frustration ersparen.
tl; dr: Blinzeln Sie nicht bei Druckprotokollen: Erheben Sie stattdessen Ausnahmen. Vermeiden Sie Kaninchenlöcher, indem Sie die Fehler vor dem Debuggen sorgfältig lesen.
Debuggen der Ruby-on-Rails-Anwendung mit pry
pry ist ein leistungsfähiges Werkzeug, mit dem Sie jede Ruby-Anwendung debuggen können. Das Einrichten einer Ruby-on-Rail-Anwendung mit diesem Edelstein ist sehr einfach und unkompliziert.
Konfiguration
So starten Sie das Debuggen Ihrer Anwendung mit pry
- In
gem 'pry'
, um die Anwendung desGemfile
und bündeln
group :development, :test do
gem 'pry'
end
- Navigieren Sie zum Stammverzeichnis der Anwendung auf der Terminal-Konsole und führen Sie die
bundle install
. Sie können es überall in Ihrer Anwendung einsetzen.
Benutzen
Die Verwendung von pry in Ihrer Anwendung umfasst lediglich die binding.pry
von binding.pry
an den Haltepunkten, die Sie beim Debuggen überprüfen möchten. Sie können binding.pry
Haltepunkte an beliebiger Stelle in Ihrer Anwendung hinzufügen, die von Ruby Interpreter interpretiert werden (alle App / Controller, App / Modelle, App / Views-Dateien).
i) Controller debuggen
app / controller / users_controller.rb
class UsersController < ApplicationController
def show
use_id = params[:id]
// breakpoint to inspect if the action is receiving param as expected
binding.pry
@user = User.find(user_id)
respond_to do |format|
format.html
end
end
end
In diesem Beispiel wird der Rails-Server am Haltepunkt mit einer UsersController
wenn Sie versuchen, ein UsersController
, show
Aktion auf UsersController
. Sie können das params
prüfen und die ActiveRecord-Abfrage für das User
von diesem Haltepunkt aus durchführen
ii) Einen View debuggen
app / views / users / show.html.haml
%table
%tbody
%tr
%td ID
%td= @user.id
%tr
%td email
%td= @user.email
%tr
%td logged in ?
%td
- binding.pry
- if @user.logged_in?
%p= "Logged in"
- else
%p= "Logged out"
In diesem Beispiel wird der Haltepunkt mit der Hebelkonsole angehalten, wenn die users/show
Seite im Rail-Server vorkompiliert ist, bevor sie an den Browser des Clients zurückgesendet wird. Dieser Haltepunkt ermöglicht es, die Richtigkeit von @user.logged_in?
zu debuggen @user.logged_in?
wenn es sich schlecht benimmt
ii) Modell debuggen
app/models/user.rb
class User < ActiveRecord::Base
def full_name
binding.pry
"#{self.first_name} #{self.last_name}"
end
end
In diesem Beispiel kann der Haltepunkt zum Debuggen der Instanzmethode full_name
User
verwendet werden, wenn diese Methode an einer beliebigen Stelle in der Anwendung aufgerufen wird.
Zusammenfassend ist pry ein leistungsfähiges Debugging-Tool für Schienenanwendungen mit einfachem Setup und einfacher Debugging-Richtlinie. Probieren Sie es aus.