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:

  1. Agregue el debugger o el byebug al grupo de development de Gemfile
  2. Ejecutar bundle install
  3. Añadir debugger o byebug como punto de interrupción
  4. Ejecutar el código o realizar solicitud
  5. Ver el registro del servidor de rieles detenido en el punto de interrupción especificado
  6. En este punto, puede usar su terminal de servidor como la rails console y verificar los valores de variable y params
  7. Para pasar a la siguiente instrucción, escriba next y presione enter
  8. Para salir teclea c y presiona enter

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.

introduzca la descripción de la imagen aquí

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:

  1. Agregue gem 'byebug' dentro del grupo de desarrollo en su Gemfile
  2. Ejecutar bundle install
  3. 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:

  1. ¿A qué clase hace referencia el error? (es decir, ¿tengo la clase de objeto correcta o mi objeto es nil ? )
  2. ¿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? )
  3. 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' al Gemfile la aplicación y Gemfile
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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow