我不确定Sinatra或其中一颗宝石是否发生了变化,但是当我尝试使用命名的params检查一条路线上的params时,结果为空。这是BetterErrors还是其他问题?
详细说明,下面是代码:
class SiteApp < App
get '/test/:id' do
abort asdfasdf
"Hello ID: #{params[:id]}"
end
end
然后,我将浏览器指向/ test / 1234,它将启动BetterError。 我希望参数的id为1234,但它是空的,仅包含“捕获”(这是另一个问题,因为我什至不确定其来源和原因)。
但是奇怪的是,如果我执行“ abort asdfasdf”而不是“中止”,它现在会显示我想看到的参数。
到目前为止,对我来说一直很好,只是做“中止”检查参数。但是现在,我需要在中止后添加一些随机字符以获取正确的参数。
这里是完整的screencast。
问题是,这是Sinatra的问题吗?还是Mustermann?还是BetterErrors?
答案 0 :(得分:1)
请勿将abort
用于此目的,因为它具有不可预测的副作用。请改用raise
。原因是abort
将终止进程并将您提供的字符串发送到STDERR
。这在简单的单进程脚本中可能很有用,但应避免在应用程序,服务器或任何可能引起线程问题的应用程序内部使用。并非出于此目的。此外,如果您想查看代码中发生了什么,强烈建议改用pry。
#app.rb
require 'sinatra'
require 'better_errors'
require 'pry' #this is recommended but only for development purposes
use BetterErrors::Middleware
BetterErrors.application_root = __dir__
BetterErrors::Middleware.allow_ip! '172.0.0.0/0'
bettererrors = true
get '/test/:id' do
"Hello ID: #{params[:id]}"
raise 'foo'
end
但是我建议改为使用撬动: 得到'/ test /:id'做 “您好ID:#{params [:id]}” binding.pry#现在您可以从ruby控制台撬栈了! 结束
然后运行
ruby app.rb
# then in browser go to http://localhost:4567/test/123
# better error opens and params are available
# inside better errors console type
params
#=> {"id"=>"123"}
如果您执行raise
而未传递任何消息,则它也可以使用。更好的错误应该可以处理异常,因此请使用raise
,因为abort
是一种从执行中取消ruby脚本的方法,在此不应用于您的目的。
您只需在终端上进行测试即可了解原因。
irb
#now you're in an interactive ruby shell
abort
#now your ruby shell session is over
irb
raise
#RuntimeError with stack trace
See this for more information on commands which kill processes参见