Ciò che si vorrebbe fare sarebbe possibile usando render_to_string e salvando il risultato in un file. Quindi il tuo controller potrebbe usare questo file. Ma è piuttosto ingombrante.
L'uso della memorizzazione nella cache automatizza questo processo e consente un controllo più dettagliato su quale parte di una pagina viene memorizzata nella cache. Inoltre, non è necessario modificare gran parte del codice esistente, poiché il meccanismo di memorizzazione nella cache si adatta perfettamente al flusso di lavoro di Rails.
I dettagli sono spiegati qui: link
Sono possibili molte strategie diverse e diversi livelli di parti di una cache nella cache o anche i valori di ritorno dei singoli metodi. A seconda di quale parte della pagina è statica e dove esattamente si trova il collo di bottiglia (più spesso metodi che accedono al database o ad un'API esterna, meno probabile il rendering stesso).
Quindi potresti usare la cache dei frammenti. Supponendo che la tua pagina sia parziale che esegue il rendering del contenuto ottenuto da una chiamata API, questo sarebbe simile a questo:
<% cache(action: 'api_stuff') do %>
<h1>that's it:</h1>
<% api_source.get_data.each do |line| %>
<%# render a line of data %>
<%# or render a partial %>
<% end %>
<% end %>
Questo ha il leggero svantaggio che è necessario effettuare la chiamata api dal codice di visualizzazione. Non esattamente il modo più elegante. La cache di Rails è in qualche modo in attesa di oggetti ActiveRecord.
Quindi potresti preferire un altro approccio e invece utilizzare manualmente la cache di Rails. In questo caso la classe che fornisce l'accesso all'API funzionerebbe in questo modo:
def get_data()
Rails.cache.fetch("some_unique_id") do
make_api_call() # if cache fails actually retrieve from API
end
end
In questo modo Rails cercherà di trovare i dati nella cache denominati "some_unique_id". Se fallisce (non esiste, è stato cancellato o è scaduto) chiamerà make_api_call () per ottenere i dati.
Puoi eliminare o scadere manualmente la cache (basta scrivere qualche script) o aggiungere un intervallo di scadenza:
Rails.cache.fetch("some_unique_id", expires_in: 24.hours) do
Manu sono possibili più varianti. Inoltre puoi decidere dove è memorizzata la cache, i file, la memoria o memcached sono solo alcune delle opzioni qui.