Czasami w aplikacjach railsowych zdarzają się błędy które trudno wychwycić gołym okiem, bądź znaleźć w logach. Co wtedy zrobić? Na szczęście programiści Ruby on Rails wymyślili narzędzie, które pomaga debugować aplikację w różnych punktach napisanego przez nas kodu.
Biblioteka breakpoint bo o niej tu mowa, umożliwia zatrzymanie wykonywania kodu i przejście do interaktywnej sesji ruby(irb). Jak z tego skorzystać? Wystarczy w dowolnym miejscu swojego kodu wstawić breakpoint, a następnie w konsoli(w głównym katalogu naszej aplikacji Rails) wpisać: ruby script/breakpointer.
Powinno pojawić się coś takiego:
No connection to breakpoint service at druby://localhost:42531 (DRb::DRbConnError)
Tries to connect will be made every 2 seconds…
Załóżmy, że mamy kontroler users oraz akcję create:
class UsersController < ApplicationController def create @user = User.new(params[:user]) breakpoint @user.created_at = Time.now @user.save end end
Teraz w przeglądarce wywołajmy akcję create dla kontrolera users. Przetwarzanie kodu zatrzyma się w miejscu ustawienia breakpointa i uruchomiona zostanie irb(dzięki skryptowi breakpointer). Od tego momentu możemy testować, sprawdzać oraz debugować nasz kod. Kiedy znajdziemy błąd i zechcemy opuścić konsolę wpisujemy exit. Sesja irb zostanie zatrzymana i zostanie wywołana dalsza część skryptu.
Więcej informacji na temat debugowania można znaleźć na stronie wiki projektu Ruby on Rails.
Zamiast biblioteki breakepointer zaleca się używanie biblioteki Ruby-debug, która od wersji Rails 2.0 zastąpi w/w bibliotekę. Instalacja i użycie sprowadza się do kilku czynności
Instalacja biblioteki:
# gem install ruby-debug
Edycja pliku config/environments/development.rb poprzez dodanie na końcu linijki:
require 'ruby-debug'
W kodzie zamiast breakpoint wpisujemy debugger.
Uruchamiamy serwer WebRick a następnie wywołujemy akcję w kontrolerze. W konsoli w której uruchomiliśmy WebRick'a uruchomiony zostanie irb. Konsolę opuszczamy podobnie jak w przypadku breakepoint'a używając słowa kluczowego exit.
Więcej na temat używania Ruby-debuggera na stronie wiki.
A na głównej stronie pisze
„Note: Breakpointer has pretty much been deprecated as far as I can tell (Rails Changeset 6611). Use Ruby Debug, as it is much more robust and should be incorporated into Rails 2.0. – Adam G.”
A to dlatego, że breakpointer korzysta z buga Rubiego, który został wyeliminowany w nowej wersji interpretera.
(można doczytać w http://www.sitepoint.com/article/debug-rails-app-ruby-debug)
Zostaje albo ruby-debug, który daje Ci takie same możliwości jak breakpointer (opis w artykule).
Albo..
Super, megawypaśny debugger w netbeans, który pozwala na debugowanie aplikacji wprost w IDE. Jest to o wiele wygodniejsze od klepania w konsoli. Brakuje mu jeszcze takich ficzerów jak podmiana wartości zmiennych w czasie debugowanie, ale myślę, że to kwestia czasu (na razie są tylko do odczytu).
@Radarek: wczoraj nie zauważyłem tej czerwonej informacji o deprecated 😛 Dzięki za info. Poprawiłem wpis 🙂