Domanda

Ho un'applicazione che utilizza caches_page per alcuni controller/azioni. Per scadere la cache, uso uno spazzino. Tutto sommato, è una soluzione standard.

Tuttavia, poiché alcune modifiche possono causare un po 'di fretta sul server (poiché le notifiche push vengono inviate e possono innescare dispositivi client per recuperare nuovi dati), mi piacerebbe essere in grado di prevedere la cache, quindi È pronto prima che le richieste arrivino. Potrei semplicemente aspettare la prima richiesta per scrivere automaticamente la cache, ovviamente, ma in questo caso, io sapere che le richieste arriveranno, che potrebbero esserci molte e che potrebbero essere quasi stimolanti. Quindi mi piacerebbe avere la cache pronta.

Per aggiungere un po 'di complessità, gli aggiornamenti vengono eseguiti tramite una normale pagina Web e gestiti in un controller standard, per lo più impalcati, mentre la "pagina" che voglio memorizzare nella cache è la risposta JSON per un controller completamente diverso che funge da API.

Quindi, come faccio, da uno spazzino (o dal controller che gestisce l'aggiornamento che espira la cache) attiva una nuova cache di pagina da scrivere immediatamente?

Un altro modo per dirlo potrebbe essere: come faccio una richiesta interna da un controller all'altro?


EDIT: Finisci per fare qualcosa come quello che vedi di seguito. Non è terribilmente elegante, ma è efficace

class ModelSweeper < ActionController::Caching::Sweeper
  observe Model

  def after_create(model)
    expire_pages_for(model)
  end

  def after_update(model)
    expire_pages_for(model)
  end

  def after_destroy(model)
    expire_pages_for(model)
  end

  protected

    def expire_pages_for(model)
      # expire index page
      expire_and_bake(models_url)

      # expire show page
      expire_and_bake(model_url(model))
    end

    def expire_and_bake(url)
      # extract the path from the URL
      path = url.sub(%r{\Ahttp://[^/]+}, "")

      # expire the cache
      expire_page(path)

      # request the url (writes a new cache)
      system "curl '#{url}' &> /dev/null &"
    end

end

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top