参数如何不再包含BetterError中的命名参数?

时间:2018-10-06 15:21:32

标签: ruby sinatra

我不确定Sinatra或其中一颗宝石是否发生了变化,但是当我尝试使用命名的params检查一条路线上的params时,结果为空。这是BetterErrors还是其他问题?

详细说明,下面是代码:

class SiteApp < App  

  get '/test/:id' do
    abort asdfasdf
    "Hello ID: #{params[:id]}"
  end

end

然后,我将浏览器指向/ test / 1234,它将启动BetterError。 我希望参数的id为1234,但它是空的,仅包含“捕获”(这是另一个问题,因为我什至不确定其来源和原因)。

BetterError params empty

但是奇怪的是,如果我执行“ abort asdfasdf”而不是“中止”,它现在会显示我想看到的参数。

BetterError shows params now

到目前为止,对我来说一直很好,只是做“中止”检查参数。但是现在,我需要在中止后添加一些随机字符以获取正确的参数。

这里是完整的screencast

问题是,这是Sinatra的问题吗?还是Mustermann?还是BetterErrors?

1 个答案:

答案 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参见