为什么 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 参见
我不确定 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 参见