2010-06-25 9 views
11

Ho un metodo nel mio controller che utilizza Send_Data come questo:Come faccio a impostare Scadenza: intestazione quando si utilizza Send_Data

def show 
    expires_in 10.hours, :public => true 
    send_data my_image_generator, :filename => "image.gif", :type => "image/gif" 
end 

Utilizzando expires_in risultati nelle intestazioni di essere inviato in questo modo:

HTTP/1.1 200 OK 
Connection: close 
Date: Fri, 25 Jun 2010 10:41:22 GMT 
ETag: "885d75258e9306c46a5dbfe3de44e581" 
Content-Transfer-Encoding: binary 
X-Runtime: 143 
Content-Type: image/gif 
Content-Disposition: inline; filename="image.gif" 
Content-Length: 1277 
Cache-Control: max-age=36000, public 

Quello che vorrei fare è aggiungere un'intestazione come Expires: (some exact date) per impedire la riconvalida dell'agente utente. Ma non vedo come rendere send_data impostare quell'intestazione?

immagino che potuto impostarlo in modo esplicito nel response.headers hash, ma sicuramente ci deve essere un wrapper per questo (o qualcosa del genere)?

risposta

10

A quanto pare sembra che ci sia alcun modo per passare scade a Send_Data - invece è necessario impostare voi stessi in response.headerse prendersi cura di formattazione della data in modo appropriato:

response.headers["Expires"] = CGI.rfc1123_date(Time.now + period) 

Nota che la direttiva max-age nel L'intestazione Cache-Control sostituisce l'intestazione Expires se sono presenti entrambi. Vedi RFC2616 Section 14.9.3 per maggiori dettagli.

27

mi sono imbattuto in questa sintassi e mi piace :-)

response.headers["Expires"] = 1.year.from_now.httpdate 
+2

che è molto più fresco: P – conny

+0

si fa a mettere quello prima o dopo il send_data? – 0112

+0

Aggiungi prima 'send_data'; una volta chiamato 'send_data', è inutile impostare le intestazioni. – Abdo

3

Il codice nella tua domanda dovrebbe effettivamente lavorare sui recenti Rails:

`expires_in 10.hours, :public => true` 
+4

Non è esattamente ciò che fa il richiedente nel suo codice originale? – bredikhin

+0

In realtà ho trovato che funziona su Rails 4.2, forse Rails ha corretto un bug? Assicurati di evitare che le intestazioni manuali vengano impostate nello stesso metodo. Ha l'ulteriore vantaggio di permetterti di dichiararlo pubblico. – mahemoff

Problemi correlati