Я борюсь со странной проблемой. Согласно http://github.com/sinatra/sinatra (secion Фильтры) объект ответа доступен в после блоков фильтра в Sinatra 1.0. Однако response.status правильно доступен, я не вижу непустой response.body от своих маршрутов внутри после фильтра.
У меня есть этот rackup файл:
config.ru
require 'app'
run TestApp
Затем Sinatra 1.0.b драгоценный камень установил использование:
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
И теперь, я хотел бы получить доступ к ответу в после фильтра. Когда я запускаю это приложение, и доступ / тестируют URL, я получил 500 ответов, как будто ответ пуст, но ответ ясно является 'Некоторым ответом'.
Наряду с моим запросом к тесту/, отдельный запрос к/favicon.ico выпущен браузером, и это возвращается 404, поскольку нет никакого маршрута, ни статического файла. Но я ожидал бы, что 500 состояний будут возвращены, поскольку ответ должен быть пустым.
В консоли я вижу, что в после фильтра, ответ на/favicon.ico - что-то как 'Не найденный', и ответ на тест / действительно пуст даже при том, что существует ответ, возвращенный маршрутом.
Что я пропускаю?
Response.body устанавливается Sinatra: : Base # invoke, который оборачивается вокруг Sinatra :: Base # dispatch !, который, в свою очередь, вызывает фильтры. Однако #invoke устанавливает тело ответа после отправки! сделано, поэтому тело еще не поставлено. То, что вы хотите сделать, вероятно, лучше решить с помощью промежуточного программного обеспечения для стойки.