2013-05-23 10 views
9

Poiché Rails 4 ha rimosso il caching delle pagine e il caching delle azioni, mi chiedo quale sia il modo Rails 4 per memorizzare un'azione che non ha variabili e ha solo html nella vista? Devo frammentare nella cache l'html statico nella vista? Come faccio a impostare un etag/fresh_quando quando non ci sono modelli con cui impostare la scadenza? Sto facendo fatica a trovare un esempio o una convenzione per memorizzare nella cache quella che dovrebbe essere la pagina più semplice da memorizzare nella cache.Caching/Etag per azione statica in Rails 4

Una nota è che mentre la vista è completamente statica, la pagina ha ancora una barra di navigazione dinamica a seconda che l'utente abbia eseguito l'accesso o meno. Come gestiresti una pagina statica come questa senza ricorrere al caching delle azioni da quando è stata rimossa e la convenzione è stata impostata per non utilizzare la versione gem?

Esempio:

class HomesController < ApplicationController  
    def index 
    end 
end 

case/index.html.erb

<div>A bunch of normal html tags with no erb</div> 

Edit: Sulla base di @ Severin risposta e la mia ricerca, qui è quello che ho messo a punto finora.

class HomesController < ApplicationController  
    def index 
    fresh_when(["some-identifier", current_user, flash]) 
    end 
end 

Inoltre, sto usando https://github.com/n8/bust_rails_etags per ripristinare tutte le etags dopo un'implementare perché la vista potrebbe essere cambiato tra implementa. Penso che questo copra l'etag abbastanza bene anche se sono curioso di sapere se sia fresco quando includerà un identificatore della vista automaticamente e se "qualche-idnetificatore" è necessario? Sarà un problema che a volte current_user e flash saranno nulli?

Ora sul secondo punto del frammento nella cache del contenuto statico. Sto assumendo se ho fatto:

cache "v1" do 
    all my html 
end 

avrei dovuto ricordarsi di cambiare sempre l'identificatore della cache quando la pagina è cambiata altrimenti la mia applicazione servirebbe contenuto non aggiornato. Un modo per automatizzare anche questo o è già gestito da binari? Sarebbe bello semplicemente mettere in cache l'ultima volta che la vista è stata aggiornata o qualcosa di intelligente, quindi non devo tenere traccia quando il mio contenuto statico è cambiato.

+0

Ho risposto alla seconda parte della domanda nella mia risposta. Se qualcosa non è chiaro o se hai ulteriori domande, non esitare a chiedere loro :) – severin

risposta

10

È possibile impostare un ETAG/Data ultima modifica dati senza un modello, controllare la documentazione: http://api.rubyonrails.org/classes/ActionController/ConditionalGet.html#method-i-fresh_when

Così si potrebbe fare qualcosa di simile:

def index 
    fresh_when(:etag => 'some_made_up_etag', :last_modified => a_long_time.ago, :public => true) 
    render 
end 

Nota: non è necessario fornire un etag e un ultimo modificato al timestamp, potresti semplicemente fornire un etag o solo un ultimo modificato al timestamp.

Oltre a questo, vorrei anche frammentare la cache dell'intero contenuto della vista.

Oppure si può semplicemente continuare a utilizzare azione-/page_caching utilizzando il funzionario plugin/gemma: https://github.com/rails/actionpack-page_caching


Alcune aggiunte per quanto riguarda la seconda parte della tua domanda:

Rails aggiunge il contenuto del RAILS_CACHE_ID variabile di ambiente a tutte le sue chiavi di cache (l'etag e la chiave di cache del frammento nell'esempio). La gemma bust_rails_etags aggiunge un'altra variabile d'ambiente che riguarda solo gli etags ...Quindi nel tuo caso puoi semplicemente rimuovere la gemma bust_rails_etags e aggiornare la variabile d'ambiente RAILS_CACHE_ID su tutti i tuoi deploys.

È anche possibile automatizzare l'aggiornamento della variabile di ambiente RAILS_CACHE_ID con l'aggiunta di qualcosa di simile nel config/environment.rb:

code_revision = # ... some piece of code that gets the current revision. 
       # I'm using git and I use the following (crude) piece of 
       # to get the current revision: 
       # code_revision = `git log --pretty=format:%h -n1`.strip 
ENV['RAILS_CACHE_ID'] = code_revision 

In questo modo, la revisione del codice corrente è sempre aggiunto a tutte le chiavi della cache .

+0

Sì, questo era in linea con le mie idee. Ho aggiornato la mia domanda con alcune altre domande che ho sul caching statico. – John

+0

Grazie per la tua risposta era quello che stavo cercando. Sto usando heroku deploy tag invece di git dato che heroku stava lanciando un errore con il comando git che sembra funzionare alla grande! – John

+0

rails 4 etag è ben coperto dagli screencast di [rails 4 zombie owtlaws] (http://rails4.codeschool.com/videos) – equivalent8