Хорошо, это простая задача. После того, как я рендерил HTML клиенту, я хочу выполнить вызов БД с информацией из запроса.
Я использую sinatra, потому что это легкая микрофреймкара, но на самом деле я готов на что угодно в ruby, если это быстрее / проще (Rack?). Я просто хочу получить URL-адрес и перенаправить клиента в другое место на основе URL-адреса.
Итак, как можно поступить с реечным / sinatra настоящим after_filter. И под after_filter я имею в виду после отправки ответа клиенту. Или это просто невозможно без нитей?
Я разветвлял sinatra и добавлял после фильтров, но нет способа сбросить ответ, даже send_data, который предполагается для потоковых файлов (который, очевидно, для двоичных файлов), ожидает after_filters.
Я видел этот вопрос: Multipart-response-in-ruby но ответ для рельсов. И я не уверен, действительно ли он сбрасывает ответ клиенту, а затем позволяет обрабатывать его позже.
Rack :: Callbacks имеет некоторые обратные вызовы до и после, но даже те, которые выглядят так, как будто они будут работать до того, как ответ будет отправлен клиенту, вот реализация Rack :: Callbacks (добавлен комментарий):
def call(env)
@before.each {|c| c.call(env) }
response = @app.call(env)
@after.each {|c| c.call(env) }
response
#i am guessing when this method returns then the response is sent to the client.
end
Так что я знаю, что могу вызвать фоновую задачу через оболочку с помощью rake. Но было бы неплохо не иметь слишком ... Также есть NeverBlock , но это хорошо для выполнения отдельного процесса без задержки ответа, или это все равно заставит приложение ждать в целом (я думаю, что это будет )
Я знаю, что это много, но вкратце это простой after_filter, который действительно работает после отправки ответа в ruby / sinatra / rack.
Спасибо, что прочитали или ответили на мой вопрос! : -)