2009-02-04 8 views
6

Ok, è un compito semplice. Dopo aver reso html al client, voglio eseguire una chiamata db con le informazioni dalla richiesta.Qual è il modo più veloce per un vero sinatra (ruby/rack) after_filter?

Sto usando sinatra perché è un microframework leggero, ma ho davvero qualcosa in ruby, se è più veloce/più facile (Rack?). Voglio solo ottenere l'URL e reindirizzare il client da qualche altra parte in base all'URL.

Così come si fa con rack/sinatra un vero after_filter. E dopo after_filter intendo dopo che la risposta è stata inviata al cliente. O semplicemente non è impossibile senza fili?

I sinatra forgiato e aggiunto dopo i filtri, ma non c'è modo di svuotare la risposta, anche send_data che è supponiamo di eseguire lo streaming di file (che è ovviamente per binario) attende i after_filters.

Ho visto questa domanda: Multipart-response-in-ruby ma la risposta è per le guide. E non sono sicuro che in realtà svuota la risposta al client e quindi consente l'elaborazione in seguito.

Rack :: richiamate ha qualche prima e dopo le richiamate, ma anche quelli sembrano avrebbero eseguire prima la risposta viene mai inviata al client ecco Rack::Callbacks applicazione (Commento aggiunto):

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 

quindi so io potrebbe chiamare un'attività in background attraverso la shell con rake. Ma sarebbe bello non averlo anche ... Inoltre c'è NeverBlock ma è buono per eseguire un processo separato senza ritardare la risposta o renderebbe comunque l'app attesa nell'insieme (penso che sarebbe)?

So che questo è molto, ma in breve è semplice after_filter che viene eseguito dopo che la risposta è stata inviata in ruby ​​/ sinatra/rack.

Grazie per aver letto o risposto alla mia domanda! porto run_later :-)

risposta

5

modificato per rotaie per fare il trucco il file è disponibile qui:

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

+0

Questo URL non funziona. Credo che sia stato aggiornato su http://github.com/pmamediagroup/sinatra_run_later/tree/master –

+0

Questo non è più necessario! :-) Si!!! Jimmy Schementi ha aggiunto il lavoro dopo i filtri a Sinatra nella versione 1.0 (non ho ancora verificato ciò nonostante) Controllare le modifiche @ http://github.com/sinatra/sinatra/blob/master/CHANGES – jaredmdobson

+1

non vero; I filtri 'dopo' di Sinatra corrono dopo il percorso, ma prima che la risposta sia inviata all'utente (dandoti l'ultima possibilità di modificare la risposta). – Phrogz