2015-01-21 3 views
5

Sto seguendo un libro chiamato Sviluppo Web agile con Rails 4 e sto riscontrando un problema mentre capisco cosa fa cache ['store', Product.latest] nel file di visualizzazione.Rails: cosa fa la funzione cache ['store', Product.latest] nella cache dei frammenti?

#static function latest is defined in the model 
def self.latest 
    Product.order(:updated_at).last 
end 

#here is my view file 

<% cache['store',Product.latest] do %> 
<% @products.each do|product| %> 
    <% cache['entry',product] do %> 
    <div class="entry"> 
     <%= image_tag(product.image_url) %> 
     <h3><%= product.title %></h3> 
     <%= sanitize(product.description) %> 
     <div class="price_line"> 
     <span class="price"><%= number_to_currency(product.price) %></span> 
     </div> 
    </div> 
    <% end %> 
<% end %> 
<% end %> 
+0

Hai [leggi questo] (http://edgeguides.rubyonrails.org/caching_with_rails.html)? – GoBusto

risposta

1

Il cache(key) { ... } helper esegue il contenuto del blocco, nella cache il risultato con la chiave data per un certo periodo di tempo.

La documentazione spiega in dettaglio tutte le varie opzioni e caratteristiche.

Nel tuo caso, ['store',Product.latest] sono i parametri che creano il nome della chiave di cache. Gli elementi nell'array vengono uniti per produrre un String simile a store/products/100-20140101-163830 che viene quindi utilizzato come chiave di cache per memorizzare il risultato del blocco.

Il motivo per cui Product.latest viene passato come argomento della chiave di cache, è un trucco per assicurarsi che il frammento sia scaduto non appena un nuovo prodotto viene aggiunto al database. Questo approccio viene spesso definito come modello di scadenza basato su chiavi.

+0

Il libro dovrebbe dirmi che è un aiuto. –

+1

Come regola d'oro, un metodo chiamato in una vista senza ricevitore (quindi ricevitore implicito) deve essere un 'Helper' (a meno che non sia definito in un ambito molto ampio come' Kernel' o 'Object'). ;) –

+0

Salvato un giorno per me. :) –