ruby on rails - tutorial - ¿Cómo depuras una aplicación de Sinatra como una aplicación de Rails?
ruby on rails que es (9)
¿Has pensado en probar algo como este artículo? http://www.gittr.com/index.php/archive/logging-with-sinatra-and-passenger-another-try/
En mi controlador principal de Sinatra, quiero depurar el hash params después de que se publique desde un formulario.
Yo he añadido:
puts params.inspect
y
set :logging, :true
El params.inspect
funciona si todo va bien. Pero si ocurre un error antes de que se ejecute el controlador, no obtengo ninguna información sobre el error como lo haría en Rails de forma predeterminada.
¿Cuál es la mejor manera de obtener información útil de depuración?
Este ejemplo no funcionó en absoluto (la aplicación ni siquiera se iniciaría después de agregar este código):
configure do
Log = Logger.new("sinatra.log")
Log.level = Logger::INFO
end
seguido por:
Log.info "#{@users.inspect}"
Como dice @jshen, ruby-debug es una herramienta muy buena.
Para usarlo en Sinatra, inserte
require ''ruby-debug/debugger''
donde te gustaría comenzar la depuración.
Mi opinión es que para la depuración debe usar configure :development
do porque en este escenario están activadas algunas marcas de depuración. Por lo tanto, bajo su bloque de configure do
puede habilitar los indicadores:
enable :logging, :dump_errors, :raise_errors
y para su instalación de registro:
log = File.new("sinatra.log", "a")
STDOUT.reopen(log)
STDERR.reopen(log)
Del manual de Sinatra:
dump_errors
opcióndump_errors
controla si el retroceso se vuelca enrack.errors
cuando serack.errors
una excepción desde una ruta. La opción está habilitada de forma predeterminada para las aplicaciones de nivel superior.raise_errors
: permite que las excepciones se propaguen fuera de la aplicación (...) La opción:raise_errors
está deshabilitada de forma predeterminada para aplicaciones de estilo clásico y habilitada de forma predeterminada para las subclases Sinatra :: Base.
Yo tambien uso el
puts "something" + myvar.inspect
Método en medio de mis controladores.
Para encontrar la mejor manera de depurar la aplicación sinatra, creé un repositorio en github. La parte más útil es el paso a la depuración del método, que se ve a continuación.
Aquí está el repositorio: https://github.com/hlee/sinatra_debugger_example
Puedes intentar agregar un filtro anterior que imprima los parámetros
before do
puts ''[Params]''
p params
end
Recomiendo encarecidamente usar ruby-debug. Es muy fácil de configurar y usar una vez que aprenda los cuatro o cinco comandos básicos. Te permitirá establecer un punto de interrupción en el que quieras inspeccionar los parámetros y jugar de forma interactiva con ellos como lo harías en IRB.
Recomiendo usar Pry o el depurador de Ruby. Con Pry, puedes usar la línea de comando para atravesar tus métodos y variables como lo harías en bash.
Consulte " ¿Cómo usar Pry con Sinatra? ".
Recomiendo usar la gema debugger .
Para usar esto con tu aplicación Sinatra:
Agrega la gema a tu Gemfile
gem "debugger"
Instala la gema corriendo
bundle
En su archivo principal de la aplicación sinatra, agregue
require ''debugger''
Ahora para depurar, solo tienes que agregar la siguiente línea
debugger
En cualquier parte de tu código.
Cuando se ejecuta el código y se ve el debugger
, el código se detiene y puede inspeccionar variables, ejecutar comandos (usando eval
), etc.
Supongo que desde que mencionaste tu controlador principal de Sinatra, tienes más de uno, lo que significa que estás subclasificando Sinatra :: Base en lugar de usar una aplicación clásica (nivel superior) de Sinatra. Si este es el caso, gran parte del manejo de errores predeterminado que realiza Sinatra está deshabilitado de forma predeterminada.
Si incluye set :show_exceptions, true if development?
en la definición de clase, obtendrá páginas de error amigables que incluyen un seguimiento de pila, parámetros, etc., en lugar de solo un error interno del servidor. Otra opción es set :raise_errors, false
y luego incluir un error do ... end
block que se ejecutará cada vez que una de sus rutas genere un error.