为什么 params 不再包含 BetterError 中的命名参数?

How come params no longer contains the named parameters in BetterError?

我不确定 Sinatra 或其中一个 gem 中是否发生了某些更改,但是当我尝试检查具有命名参数的路由上的参数时,它是空的。这是 BetterErrors 的问题还是其他问题?

为了详细说明,这里是代码:

class SiteApp < App  

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

end

然后我将浏览器指向 /test/1234 以启动 BetterError。 我希望 params 的 ID 为 1234,但它是空的,只包含 'captures'(这是另一个问题,因为我什至不确定它的来源和原因)。

但奇怪的是,如果我不执行 'abort',而是执行 'abort asdfasdf',它现在会显示我想查看的参数。

它对我来说一直很好用,直到现在只是 'abort' 检查参数。但是现在,我需要在中止后添加一些随机字符以获得正确的参数。

这里是完整的screencast

问题是,这是 Sinatra 的问题吗?还是穆斯特曼?还是 BetterErrors?

不要将 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

但我建议改用 pry: 得到 '/test/:id' 做 "Hello 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,它也有效。 Better Errors 应该处理异常,所以使用 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 参见