Ruby on Rails
Depuración
Buscar..
Aplicación de depuración de rieles
Para poder depurar una aplicación es muy importante comprender el flujo de la lógica y los datos de una aplicación. Ayuda a resolver errores lógicos y agrega valor a la experiencia de programación y la calidad del código. Dos gemas populares para la depuración son el depurador (para ruby 1.9.2 y 1.9.3) y byebug (para ruby> = 2.x).
Para depurar archivos .rb
, siga estos pasos:
- Agregue el
debugger
o elbyebug
al grupo dedevelopment
deGemfile
- Ejecutar
bundle install
- Añadir
debugger
obyebug
como punto de interrupción - Ejecutar el código o realizar solicitud
- Ver el registro del servidor de rieles detenido en el punto de interrupción especificado
- En este punto, puede usar su terminal de servidor como la
rails console
y verificar los valores de variable y params - Para pasar a la siguiente instrucción, escriba
next
y presioneenter
- Para salir teclea
c
y presionaenter
Si desea depurar archivos .html.erb
, el punto de interrupción se agregará como <% debugger %>
Depurando en tu IDE
Cada IDE bueno proporciona una GUI para la depuración interactiva de aplicaciones de Ruby (y, por lo tanto, de Rails) donde puede agregar puntos de interrupción, relojes, pausas automáticas de excepción y le permite seguir la ejecución del código incluso paso a paso, línea por línea.
Por ejemplo, eche un vistazo a una de las mejores funciones de depuración de Ruby IDE, RubyMine en la imagen.
Depuración de Ruby on Rails rápidamente + Consejo para principiantes
La depuración al generar excepciones es mucho más fácil que entrecerrar los ojos a través de print
declaraciones del registro de print
, y para la mayoría de los errores, generalmente es mucho más rápido que abrir un depurador irb como pry
o byebug
. Esas herramientas no deberían ser tu primer paso.
Depurando Ruby / Rails rápidamente:
1. Método rápido: .inspect
una Exception
e .inspect
su resultado.
La forma más rápida de depurar el código de Ruby (especialmente Rails) es raise
una excepción a lo largo de la ruta de ejecución de su código al llamar a .inspect
en el método u objeto (por ejemplo, foo
):
raise foo.inspect
En el código anterior, raise
desencadena una Exception
que detiene la ejecución de su código, y devuelve un mensaje de error que contiene convenientemente .inspect
información sobre el objeto / método (es decir, foo
) en la línea que usted está tratando de depurar.
Esta técnica es útil para examinar rápidamente un objeto o método ( por ejemplo, ¿es nil
? ) Y para confirmar de inmediato si una línea de código se ejecuta incluso en un contexto determinado.
2. Fallback: use un depurador IRB de rubí como byebug
o pry
Solo después de que tenga información sobre el estado del flujo de ejecución de sus códigos, debe considerar pasar a un depurador irb ruby gem como pry
o byebug
donde puede profundizar más en el estado de los objetos dentro de su ruta de ejecución.
Para usar la gema byebug
para la depuración en Rails:
- Agregue
gem 'byebug'
dentro del grupo de desarrollo en su Gemfile - Ejecutar
bundle install
- Luego, para usarlo, inserte la frase
byebug
dentro de la ruta de ejecución del código que desea examinar.
Esta variable byebug
cuando se ejecute abrirá una sesión IRB de ruby de su código, brindándole acceso directo al estado de los objetos tal como están en ese punto en la ejecución del código.
Los depuradores de IRB como Byebug son útiles para analizar profundamente el estado de su código a medida que se ejecuta. Sin embargo, son un procedimiento que consume más tiempo en comparación con el aumento de errores, por lo que en la mayoría de las situaciones no deberían ser su primer paso.
Consejos generales para principiantes
Cuando intenta depurar un problema, un buen consejo es siempre: Lea el mensaje de error (@F) del @ @ $ $ ing
Eso significa leer los mensajes de error con cuidado y por completo antes de actuar para que entiendas lo que está tratando de decirte. Cuando realice la depuración, haga las siguientes preguntas mentales, en este orden , al leer un mensaje de error:
- ¿A qué clase hace referencia el error? (es decir, ¿tengo la clase de objeto correcta o mi objeto es
nil
? ) - ¿Qué método hace referencia el error? ( es decir, ¿ es un tipo en el método? ¿Puedo llamar a este método en este tipo / clase de objeto? )
- Finalmente, utilizando lo que puedo deducir de mis últimas dos preguntas, ¿qué líneas de código debo investigar? (recuerde: la última línea de código en el seguimiento de la pila no es necesariamente donde reside el problema).
En el seguimiento de la pila, preste especial atención a las líneas de código que provienen de su proyecto (por ejemplo, líneas que comienzan con la app/...
si está usando Rails). El 99% de las veces el problema es con tu propio código.
Para ilustrar por qué la interpretación en este orden es importante ...
Por ejemplo, un mensaje de error de Ruby que confunde a muchos principiantes:
Ejecuta código que en algún momento se ejecuta como tal:
@foo = Foo.new
...
@foo.bar
y obtienes un error que dice:
undefined method "bar" for Nil:nilClass
Los principiantes ven este error y piensan que el problema es que la bar
método no está definida . No es. En este error la parte real que importa es:
for Nil:nilClass
for Nil:nilClass
significa que @foo
es Nil! @foo
no es una variable de instancia de Foo
! Tienes un objeto que es Nil
. Cuando ve este error, es simplemente ruby tratando de decirle que la bar
método no existe para los objetos de la clase Nil
. (bueno duh! ya que estamos tratando de usar un método para un objeto de la clase Foo
no Nil
).
Desafortunadamente, debido a la forma en que se escribe este error ( undefined method "bar" for Nil:nilClass
) es fácil undefined method "bar" for Nil:nilClass
pensar que este error tiene que ver con que la bar
undefined
esté undefined
. Cuando no se lee con atención, este error hace que los principiantes se adentren por error en los detalles del método de bar
en Foo
, perdiendo por completo la parte del error que insinúa que el objeto es de la clase incorrecta (en este caso: nil). Es un error que se evita fácilmente leyendo los mensajes de error en su totalidad.
Resumen:
Siempre lea atentamente el mensaje de error completo antes de comenzar cualquier depuración. Eso significa que: siempre verifique primero el tipo de clase de un objeto en un mensaje de error, luego sus métodos , antes de comenzar a buscar en cualquier seguimiento de pila o línea de código donde cree que puede estar ocurriendo el error. Esos 5 segundos pueden ahorrarle 5 horas de frustración.
tl; dr: No entrecerrar los ojos en los registros de impresión: en su lugar, generar excepciones. Evite los agujeros de conejo leyendo los errores cuidadosamente antes de depurar.
Depuración de la aplicación ruby-on-rails con palanca
pry es una herramienta poderosa que se puede usar para depurar cualquier aplicación ruby. Configurar una aplicación de rubí sobre rieles con esta gema es muy fácil y directo.
Preparar
Para comenzar a depurar tu aplicación con palanca
- Agregue
gem 'pry'
alGemfile
la aplicación yGemfile
group :development, :test do
gem 'pry'
end
- Navegue hasta el directorio raíz de la aplicación en la consola de terminal y ejecute la
bundle install
. Ya está todo listo para comenzar a usarlo en cualquier parte de su aplicación.
Utilizar
El uso de la palanca en su aplicación solo incluye el binding.pry
en los puntos de interrupción que desea inspeccionar mientras realiza la depuración. Puede agregar binding.pry
interrupción binding.pry
en cualquier lugar de su aplicación que sea interpretado por el intérprete de ruby (cualquier aplicación / controlador, aplicación / modelo, aplicación / archivos de vista)
i) Depuración de un controlador
app / controllers / 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
En este ejemplo, el servidor de rieles se detiene con una consola de palanca en el punto de quiebre cuando intenta visitar el enrutamiento de una página para show
acción en UsersController
. Puede inspeccionar el objeto params
y hacer una consulta ActiveRecord en el modelo de User
desde ese punto de interrupción
ii) Depurar una vista
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"
En este ejemplo, el punto de ruptura se detiene en la consola de palanca cuando la página de users/show
se compila previamente en el servidor de rieles antes de enviarla de nuevo al navegador del cliente. Este punto de ruptura permite depurar la corrección de @user.logged_in?
cuando se está portando mal.
ii) Depurar un modelo
app/models/user.rb
class User < ActiveRecord::Base
def full_name
binding.pry
"#{self.first_name} #{self.last_name}"
end
end
En este ejemplo, el punto de ruptura se puede usar para depurar el método de instancia del modelo de User
full_name
cuando se llama a este método desde cualquier lugar de la aplicación.
En conclusión, pry es una poderosa herramienta de depuración para la aplicación de rieles con una configuración sencilla y una guía de depuración directa. Prueba esto.