schlecht ETag-Wert in Test- und Produktionsumgebung
-
21-09-2019 - |
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
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.