2012-05-19 13 views
6

Ich habe Aktion Caching einrichten (mit Kehrmaschinen, aber ich denke, das ist hier irrelevant) in meiner Anwendung, und so weit es funktioniert großartig mit einer Ausnahme:Rails-Caching: Verfallen mehr Seiten für eine Aktion

I Verwenden Sie Kaminari für die Paginierung, und wenn ich also expire_action auf meine Aktion ausführen, läuft nur die erste Seite ab. Da ich weiß, dass die Zwischenspeicherung nicht funktioniert, wenn die Abfragezeichenfolge zum Angeben der Seite verwendet wird, habe ich eine Route eingerichtet, sodass die Seiten an das Ende der URL angehängt werden (z. B./people/123/page/2).

Ich werde bei Bedarf weitere Informationen zu diesem Beitrag hinzufügen, aber ich vermute, da ist etwas Offensichtliches, dass ich hier vermisse, also: Weiß jemand, wie der Rest meiner Seiten abläuft?

+0

Was würde genauso gut funktionieren würde, wenn ich alles außer der ersten Seite von der Indizierung überhaupt ausschließen könnte, da niemand die folgenden Seiten jemals sehen wird ... – rogerkk

Antwort

5

Ich bin immer noch an einer Antwort auf meine ursprüngliche Frage interessiert und werde meine akzeptierte Antwort ändern, sollte eine Lösung auftauchen. Das heißt, ich habe nur die ursprüngliche Seite zwischengespeichert, indem ich überprüft habe, ob überhaupt eine Seite angegeben wurde:

caches_action: index,: if => Proc.new {params [: page] .nil? }

+0

nice logic, bro – Mukesh

+0

Eine andere Lösung für diesen Fall ist die Verwendung 'cache_path' Option .. http://Stackoverflow.com/a/2166419/1297435 –

1

Hier ist eine Lösung, an die ich gedacht habe, vor dem gleichen Problem, obwohl es noch nicht implementiert. Cache die tatsächliche Ablaufzeit in einem eigenen Schlüssel. Der Schlüssel wäre eine kanonische Darstellung der Such-URL, also ohne den Parameter "Seite". z. B.

Benutzer sucht auf http://example.com?q=foo&page=3, so params ist { q: 'foo', page: 3 }. Streichen Sie "page = 3" aus und wir bleiben mit {q: 'foo'}.

Führen Sie to_param darauf und fügen Sie ein Präfix, und wir sind mit einem Cache-Schlüssel wie search_expiry_q=foo verlassen.

Such Cache für diese kanonische Abfrage, dh Rails.cache.read (search_expiry_q=foo). Wenn es existiert, werden wir unser Ergebnis zu diesem Zeitpunkt ablaufen lassen. Leider haben wir nur expires_in, nicht expires_at, also müssen wir eine Berechnung durchführen. d. h. so etwas wie expires_in: expiry_time - Time.now - 5.seconds (die 5 Sekunden verhindern hoffentlich alle Rennbedingungen). Wir cachen die vollständige URL/Parameter auf diese Weise.

OTOH Wenn es kein Ablaufdatum gibt, hat kürzlich niemand die Suche durchgeführt. Also tun wir:

expiry_time = Time.now + 1.hour 
Rails.cache.write(`search_expiry_q=foo`, expiry_time, expires_in: 1.hour) 

und Cache dieses Fragment/Seite, wieder mit voller URL/params und expires_in: 1.hour.

Verwandte Themen