在Sinatra 1.0中的过滤器块之后无法访问response.body

Pet*_*rel 5 ruby sinatra

我正在努力解决一个奇怪的问题.根据http://github.com/sinatra/sinatra(secion Filters),在Sinatra 1.0中的过滤器块之后可以使用响应对象.但是响应.status是可以正确访问的,我在过滤后看不到来自我的路由里面的非空响应.

我有这个架子文件:

config.ru

require 'app'
run TestApp
Run Code Online (Sandbox Code Playgroud)

然后使用以下方法安装Sinatra 1.0.b gem:

gem install --pre sinatra
Run Code Online (Sandbox Code Playgroud)

这是我的小应用程序,只有一条路线:

app.rb

require 'rubygems'
require 'sinatra/base'

class TestApp < Sinatra::Base

  set :root, File.dirname(__FILE__)

  get '/test' do
    'Some response'
  end

  after do
    halt 500 if response.empty? # used 500 just for illustation
  end

end
Run Code Online (Sandbox Code Playgroud)

现在,我想访问后过滤器内的响应.当我运行这个应用程序并访问/测试 URL时,我得到了500响应,好像响应是空的,但响应显然是"一些响应".

随着我对/ test的请求,浏览器发出了对/favicon.ico的单独请求,并且由于没有路由或静态文件而返回404.但我希望返回500状态,因为响应应为空.

在控制台中,我可以看到在后过滤器中,对/favicon.ico的响应类似于"未找到",并且对/ test的响应确实为空,即使路由返回了响应.

我错过了什么?

Kon*_*ase 6

response.body设置了Sinatra :: Base#invoke,它包围了Sinatra :: Base#dispatch !,它依次调用过滤器.但是,#invoke会在发送后设置响应体!已完成,因此身体尚未确定.使用机架中间件可能更好地解决了您想要做的事情.