2009-09-01 57 views
28

在我的主要Sinatra控制器中,我想在从表单发布后调试params散列。如何像Rails应用程序一样调试Sinatra应用程序?

我已经加入:

puts params.inspect 

set :logging, :true 

params.inspect作品,如果一切顺利的话。但是如果在控制器执行之前发生错误,我没有得到任何关于错误的信息,就像我在默认情况下在Rails中那样。

获得有用的调试信息的最佳方式是什么?

This example都没有工作(应用程序甚至不会开始后,我加入这个代码):

configure do 
    Log = Logger.new("sinatra.log") 
    Log.level = Logger::INFO 
end 

依次为:

Log.info "#{@users.inspect}" 
+1

怎么样'提高params' – coderek 2012-12-20 08:39:21

回答

19

你可以试着滤波器之前加入该打印出参数

before do 
    puts '[Params]' 
    p params 
end 
+0

不得不这样做关于继承的sinatra代码。在erb(或haml)文件内的'''<%p params%>'''在其他任何写入正文的上方。参数将出现在您的控制台中。 – 2017-05-26 00:35:42

1

我猜你自从你提到你的主Sinatra控制器,你有多个,这意味着你是继承Sinatra :: Base,而不是使用经典(顶级)Sinatra应用程序。如果确实如此,则Sinatra所执行的许多默认错误处理在默认情况下都处于禁用状态。

如果在类定义中包含set :show_exceptions, true if development?,那么您将得到包含堆栈跟踪,参数等的友好错误页面,而不仅仅是内部服务器错误。另一个选项是set :raise_errors, false,然后包含一个error do ... end块,只要其中一个路由发生错误就会运行该块。

3

我强烈推荐使用ruby-debug。学习四个或五个基本命令后,安装和使用非常容易。它可以让你设置一个断点,你想检查这些参数,并像在IRB中那样交互地使用它。

13

我的意见是,对于调试你应该使用配置:development这样做,因为在这种情况下打开了一些调试标志。所以,你的configure do块下可以启用标志:

enable :logging, :dump_errors, :raise_errors 

,并为您的日志工具:

log = File.new("sinatra.log", "a") 
STDOUT.reopen(log) 
STDERR.reopen(log) 

从西纳特拉手册:

  • dump_errors选项控制是否回溯如果路由引发异常,则转储到rack.errors。该选项默认为顶级应用程序启用。

  • raise_errors - 允许异常传播到应用以外 (...) :raise_errors选项在默认情况下对经典样式应用程序处于禁用状态,并且在默认情况下对Sinatra :: Base子类处于启用状态。

我也用

puts "something" + myvar.inspect 

方法在我的控制器的中间。

10

正如@jshen所说,ruby-debug是一个非常好的工具。

为了在西纳特拉使用它,插入

require 'ruby-debug/debugger' 

您希望调试启动。

8

我建议使用Pry或Ruby调试器。使用Pry,你可以像使用bash一样使用命令行来遍历你的方法和变量。请参阅“How to use Pry with Sinatra?”。

+0

这是迄今为止调试sinatra应用程序最有用的方法。 – three 2016-08-14 18:00:51

1

我建议使用debugger宝石。

要使用此与西纳特拉应用:

  1. 宝石添加到您的Gemfile

    gem "debugger" 
    
  2. 通过运行安装宝石

    bundle 
    
  3. 在你的主西纳特拉应用文件,请添加

    require 'debugger' 
    
  4. 我们调试,你只需要添加以下行

    debugger 
    

    随时随地在你的代码。

当正在执行的代码和debugger看到,代码将停止,您可以检查变量,运行命令(使用eval)等