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

时间:2010-03-20 19:59:46

标签: ruby sinatra

我正在努力解决一个奇怪的问题。根据{{​​3}}(secion Filters),在Sinatra 1.0中的过滤器块之后可以使用响应对象。但是响应.status是可以正确访问的,我在过滤后看不到来自我的路由内部的非空响应。

我有这个架子文件:

config.ru

require 'app'
run TestApp

然后使用:

安装Sinatra 1.0.b gem
gem install --pre sinatra

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

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

现在,我想在后过滤器中访问响应。当我运行此应用并访问 / test 网址时,我得到了 500 响应,就好像响应为空,但响应显然是“一些响应”。

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

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

我想念什么?

1 个答案:

答案 0 :(得分:6)

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