26 Oct 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 < 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 < 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:
[#<Partner id: 2, name: "jose heriberto", surnames: "perez magana", date_birth: nil, address: nil, city: nil, state: nil, telephone: nil, mobile_phone: 3121231517, email: "heriberto@micompu.com.mx", comments: nil, created_at: "2012-10-25 18:26:51", updated_at: "2012-10-25 18:26:51">, #<Partner id: 4, name: "juan camanet", surnames: "osorio", date_birth: nil, address: nil, city: nil, state: nil, telephone: nil, mobile_phone: nil, email: nil, comments: nil, created_at: "2012-10-25 19:25:06", updated_at: "2012-10-25 19:25:06">, #<Partner id: 5, name: "juan carlos", surnames: "ortiz murrieta", date_birth: nil, address: nil, city: nil, state: nil, telephone: nil, mobile_phone: nil, email: nil, comments: nil, created_at: "2012-10-26 00:38:34", updated_at: "2012-10-26 00:38:34">]
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 => 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.
Matías M.
Posted at 12:45h, 29 OctoberMuy bueno Jose, la información que estaba buscando simple y rapida de asimilar.