Frage

Ich bin mit der neuen Caching-Lösung für Rails, wie hier .

Die Entwicklung Umwelt funktioniert gut, aber der Test und Produktion senden ungültiger ETag Kopf die Parameter der stale? Funktion ignoriert.

Hier ist der entsprechende Teil eines meines Controller:

def index
  @categories = Category.all

  if stale?(:etag => @categories)
    respond_to do |format|
      format.html
      format.xml  { render :xml => @categories }
      format.json { render :json => @categories }
    end
  end
end

Die stale? Methode des ActionController::Base ruft die fresh_when Verfahren, das das etag des Response Objekts setzt, die den folgenden Code hat:

def etag=(etag)
  if etag.blank?
    headers.delete('ETag')
  else
    headers['ETag'] = %("#{Digest::MD5.hexdigest(ActiveSupport::Cache.expand_cache_key(etag))}")
  end
end

Das Category Modell sendet den richtigen cache_key, wenn ich es in jeder Umgebung zu bekommen:

>> Category.find(1).cache_key
=> "categories/1-20100117153353"
>> ActiveSupport::Cache.expand_cache_key(Category.find(:all))
=> "categories/1-20100117153353/categories/2-20100117152007/categories/3-20100116094423/categories/4-20100116094423/categories/5-20100116094423/categories/6-20100116094423/categories/7-20100116094423/categories/8-20100117145800/categories/9-20100117145808"

Also ich verstehe einfach nicht, was los ist, denn wenn ich die URL http://localhost:3000/admin/categories/ wählen mit der Entwicklung Umwelt ändert sich die ETag jedes Mal, wenn ich sparen auf einem Category aber mit Test oder Produktion nicht.

Ich habe es getestet mit webrick und dünn

War es hilfreich?

Lösung

war die Lösung, dass die Category.all Methode die Ergebnisse auf Klassenstufe zwischengespeichert, so dass, sobald es abgerufen wurde alles für den Rest der Anfragen zwischengespeichert wurde.

es war nicht da in Entwicklung Umwelt, weil jedes Mal, das Modell neu geladen wurde, weil in dieser Umgebung der config.cache_classes false war!

Andere Tipps

Ich weiß nicht, ob es ein Maximum an Kopfzeilen / Parametern, aber mit vielen Kategorien des ETag-Wert wird sehr lang, wie Ihr Beispiel zeigt bereits.

Statt eine große Zeichenfolge zu schaffen, die alle Schöpfung / Änderungsdaten, könnten Sie das letzte Änderungsdatum und Verwendung finden, dass für einen ETag.

Außerdem der Artikel zitiert Sie Verwendungen statt fresh? darunter auch einige andere Methoden stale?. Warum sind Sie nicht diejenigen mit?

Edit: Bei der Suche auf den Artikel in der aktualisiert Link der Lösung scheint zu sein ausfüllen nur ein @category (gleich wie sie es tun). Daher finden die letzte Änderung der Kategorie

@category = Category.find(:first, :order => 'date DESC')

und diesen Wert verwenden, um die MD5 für den ETag zu erzeugen.
Holen Sie die komplette Liste der @categories nur, wenn Sie die Seite zu machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top