Como debuggear tus aplicaciones en Rails

Como debuggear tus aplicaciones en Rails

En esta ocasion vamos a hablar de como debuggear nuestras aplicaciones de rails (ruby). Como todos sabemos una de las cosas que mas hacemos los developers es debuggear nuestras aplicaciones y sobre todo cuando salen bugs de nuevos features agregados y que son reportados por los clientes,  entre las tareas mas usadas al debuggear es por ejemplo querer saber que valor tiene una variable o una constante en cierto momento, por ello en el presente tutorial voy a hablar de diferentes maneras en como podemos debuggear nuestra aplicacion mediante diferentes metodos el mas simple es usar simples puts en donde queremos saber que esta pasando con cierto metodo o que valor tiene una variable o para comprobar si es la variable que nos esta llegando como lo sabemos para usar el puts lo hariamos de la siguiente manera:


puts partners.inspect
puts "partners: #{partners.inspect}";

[clear]

Otra forma tambien para debuggear nuestras aplicaciones es utilizando los helpers de rails que son:

debug
inspect
to_yaml

Por ejemplo vamos a ver un ejemplo muy simple tomado de la pagina de guides rubyonrails en el cual vamos a ver el valor de cierta variable la cual estamos utilizando en nuestra vista suponiendo que queremos saber que contenido tiene la variable post:

<%= debug @post %>
<p>
 <b>Title:</b>
 <%=h @post.title %>
</p>

Esto nos generara un resultado de la variable por ejemplo de la siguiente manera:

--- !ruby/object:Post
attributes:
updated_at: 2008-09-05 22:55:47
body: It's a very helpful guide for debugging your Rails app.
title: Rails debugging guide
published: t
id: "1"
created_at: 2008-09-05 22:55:47
attributes_cache: {}

Si queremos ver ejemplo del inspect y to_yaml podemos visitar la siguiente pagina http://guides.rubyonrails.org/debugging_rails_applications.html. Otra forma tambien muy provechosa es guardar en archivos(logs) en cualquier momento que decidamos guardar informacion para casos informativos y despues podemos abrir nuestros logs y ver que ha pasado en cierta operacion, para ello podemos utilizar el logger que es la libreria estandar de ruby para guardar informacion en archivos. Por default nuestros archivos se guardan en root_rails/log/nombredenuestroenvironment.log Existen una seria de configuraciones que podemos realizar las cuales las podemos encontrar en la pagina que arriba escribi, pero si queremos usar lo que por default trae rails a continuacion vamos a ver algunos ejemplos. Para escribir en nuestro log actual podemos usar las siguientes opciones

logger.(debug|info|warn|error|fatal) en nuestro metodo
desde un controlador, modelo o en nuestros mailers:

Algunos ejemplos son los siguientes por ejemplo en nuestro contrador ponemos lo siguiente:

class PartnersController &lt; ApplicationController
 respond_to :json

def index
partners = if params[:keywords]
#Partner.search { keywords params[:keywords] }.results
Partner.where("surnames ILIKE ? OR name ILIKE?";,
"%#{params[:keywords]}%", "%#{params[:keywords]}%")
else
Partner.all
end
 logger.debug "partners with attributes hash: #{partners.inspect}"
 logger.info "Processing the request..."
 logger.fatal "Terminating application, raised unrecoverable error!!!";

respond_with partners
 end

Y lo que podremos ver en nuestro servidor(en consola despues de correr $ rails server) veremos lo siguiente:

[divider]

DEBUGGER

[divider]

Ahora vamos a pasar a utilizar la gema de debugger la cual la encontramos en el siguiente repositorio, la cual esta basada en la gema ruby-debug(19) pero algunas mejoras.

https://github.com/cldwalker/debugger

La cual nos ayudara para detener el flujo de nuestro script con lo cual se tendremos un shell para ejecutar diferentes comandos solo con mandarla llamar de esta forma podremos avanzar dentro del archivo o regresar dependiendo de que es lo que queremos inspeccionar, primero que nada para utilizarla en nuestra aplicacion necesitamos agregarla a nuestro archivo Gemfile como una gema mas de las que utilizamos.


gem 'debugger'

Despues ejecutamos en nuestra consola:

$ bundle install

Ahora lo que necesitamos es por ejemplo poner “debugger” en el controlador o modelo que necesitamos debuggear por ejemplo en mi caso:

class PartnersController &lt; ApplicationController
 respond_to :json

def index
  partners = if params[:keywords]
    #Partner.search { keywords params[:keywords] }.results
    Partner.where("surnames ILIKE ? OR name ILIKE?",
    "%#{params[:keywords]}%", "%#{params[:keywords]}%")
  else
    Partner.all
  end
  debugger
  respond_with partners
 end
end

Despues de que tengamos nuestra aplicacion corriendo con

$ rails server

En caso de que no funcione con puro rails server podemos probar con los argumentos

$ rails server -u
or
$ rails server --debugger

Cuando visitemos dicha vista accion en nuestra aplicacion podemos ver en nuestra consola que el flujo de nuestra aplicacion se ha detenido y veremos algo como lo siguiente:

(rdb:1):

En caso de que quieramos continuar con la ejecucion normal de nuestro archivo


Y en este lugar podremos empezar a inspeccionar los valores de nuestras variables por ejemplo si quisieramos saber que regreso “partners”, escribiriamos algo como:

(rdb:1): p parterns

Que en mi caso mostrara el resultados de todos los partners que haya dado de alta en ese momento si es que no se hizo una busqueda y solo regresa algunos:

[#&lt;Partner id: 2, name: &quot;jose heriberto&quot;, surnames: &quot;perez magana&quot;, date_birth: nil,
address: nil, city: nil, state: nil, telephone: nil, mobile_phone: 3121231517,
email: &quot;heriberto@micompu.com.mx&quot;, comments: nil, created_at: &quot;2012-10-25 18:26:51&quot;,
updated_at: &quot;2012-10-25 18:26:51&quot;&gt;, #&lt;Partner id: 4, name: &quot;juan camanet&quot;,
surnames: &quot;osorio&quot;, date_birth: nil, address: nil, city: nil, state: nil,
telephone: nil, mobile_phone: nil, email: nil, comments: nil, created_at: &quot;2012-10-25 19:25:06&quot;,
updated_at: &quot;2012-10-25 19:25:06&quot;&gt;, #&lt;Partner id: 5, name: &quot;juan carlos&quot;, surnames: &quot;ortiz murrieta&quot;,
date_birth: nil, address: nil, city: nil, state: nil, telephone: nil, mobile_phone: nil,
email: nil, comments: nil, created_at: &quot;2012-10-26 00:38:34&quot;, updated_at: &quot;2012-10-26 00:38:34&quot;&gt;]

Otro de los comandos que podemos utilizar es por ejemplo el “list” o simplemente “l” para ver en que ambiente nos estamos moviendo con lo cual si usamos el siguiente comando nos moveremos

(rdb:1): l

Y podremos observar lo siguiente en nuestra consola

[8, 17] in /Users/joseheribertoperezmagana/projects/personal/mamey-control-de-gimnasios/app/controllers/partners_controller.rb
 8 "%#{params[:keywords]}%", "%#{params[:keywords]}%")
 9 else
 10 Partner.all
 11 end
 12 debugger
=&gt; 13 respond_with partners
 14 end
 15
 16 def create
 17 respond_with Partner.create(params[:partner])

O tambien podemos listar y retroceder con el comando

(rdb:1): l-

si queremos ver en que linea estamos:

(rdb:1): l=

En caso de que hayamos colocado mas de un debugger en nuestro archivo entonces podemos continuar al siguiente con el comando:

(rdb:1): c

Pero si lo que queremos es avanzar en el flujo del nuestro archivo que estamos debuggeando o sea avanzar y pasar a la siguiente linea y poder utilizar por ejemplo variables que se utilian mas adelante entonces usamos:

(rdb:1): n

Si queremos ver todas las opciones que tenemos podemos listar los comandos con

(rdb:1): help

Y para ver cada uno sus propiedades por ejemplo el de list

(rdb:1): help list

En caso que quieramos ver cuales variables estan disponibles en el frame actual podemos utilizar el comando info el cual tiene muchas opciones pero en este caso de mostrar solo las variables se necesita el siguiente parametro:

(rdb:1): info variables

o Si solo queremos mostrar las variables locales

(rdb:1): info locals

Si estamos utilizando argumentos en nuestro frame actual

(rdb:1): info args

Tambien podemos iniciar una consola en irb desde la linea que estemos esto nos evita la necesidad de hacer un rails console en otra terminal para usarlo

(rdb:1): irb

Tambien podemos abrir para editar ese archivo con el comando

(rdb:1): edit

Creo que eso es todo lo que veremos en este tutorial otra buena forma de debuggear es utilizando la gema de pry la cual pueden revisar en el siguiente link donde hay unos ejemplos de como utilizarla http://blog.crowdint.com/2012/09/03/an-alternative-irb-shell-and-ruby-debugger-for-your-apps.html
Eso es todo por ahora, saludos.

1 Comment
  • Matías M.
    Posted at 12:45h, 29 October

    Muy bueno Jose, la información que estaba buscando simple y rapida de asimilar.

Post A Comment