2009-02-04 16 views
6

Está bien, es una tarea simple. Después de renderizar html al cliente, quiero ejecutar una llamada a db con información de la solicitud.¿Cuál es la forma más rápida de un verdadero sinatra (ruby/rack) after_filter?

Estoy usando sinatra porque es un microframework liviano, pero realmente estoy listo para cualquier cosa en ruby, si es más rápido/más fácil (Rack?). Solo quiero obtener la url y redirigir al cliente a otro lugar en función de la url.

Entonces, ¿cómo se hace con rack/sinatra un after_filter real. Y después de after_filter quiero decir después de que se envía la respuesta al cliente. ¿O es que simplemente no se puede dooable sin hilos?

Bifurqué Sinatra y agregué después de los filtros, pero no hay forma de descargar la respuesta, incluso send_data que se supone que transmite archivos (que obviamente es binario) espera a los after_filters.

He visto esta pregunta: Multipart-response-in-ruby pero la respuesta es para los rieles. Y no estoy seguro de si realmente vacía la respuesta al cliente y luego permite el procesamiento posterior.

rack :: devoluciones de llamada tiene algunos antes y después de las devoluciones de llamada, pero incluso los que parecen que se ejecute antes de que la respuesta es cada vez envía al cliente aquí está Rack::Callbacks aplicación (comentario añadido):

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 

así que sé que podría llamar a una tarea en segundo plano a través del caparazón con rastrillo. Pero sería bueno no tenerlo también ... También está el NeverBlock, pero ¿es bueno para ejecutar un proceso separado sin demorar la respuesta o la aplicación esperaría en conjunto (creo que sí)?

Sé que esto es mucho, pero en resumen es simple after_filter que realmente se ejecuta después de que la respuesta se envía en ruby ​​/ sinatra/rack.

¡Gracias por leer o responder mi pregunta! :-)

Respuesta

5

Modificado puerto run_later a los carriles para hacer el truco del archivo está disponible aquí:

http://github.com/pmamediagroup/sinatra_run_later/tree/master

+0

Eso URL no funciona. Creo que fue actualizado a http://github.com/pmamediagroup/sinatra_run_later/tree/master –

+0

¡Esto ya no es necesario! :-) ¡Sí! Jimmy Schementi agregó el trabajo después de los filtros a Sinatra en la versión 1.0 (aunque todavía no lo he verificado) Compruebe los cambios en http://github.com/sinatra/sinatra/blob/master/CHANGES – jaredmdobson

+1

no es cierto; Los filtros 'after' de Sinatra se ejecutan después de la ruta, pero antes de que la respuesta se envíe al usuario (lo que le permite una última oportunidad para modificar la respuesta). – Phrogz

Cuestiones relacionadas