Ruby on Rails: Löscht eine zwischengespeicherte Seite

81

Ich habe eine RoR-Anwendung (Ruby v1.8.7; Rails v2.3.5), die eine Seite in der Entwicklungsumgebung zwischenspeichert. Dies wäre kein so großes Problem, aber die aElemente der zwischengespeicherten Seite sind falsch.

Ich habe keine Änderungen an der Datei development.rb vorgenommen und den Controllern wissentlich keine Caching-Befehle hinzugefügt.

Ich habe versucht, das Cookie und die Seiten-Caches des Browsers (Firefox 3.5 unter OSX) für diese Site (localhost) zu löschen. Ich habe auch Mongrel neu gestartet. Nichts scheint zu helfen.

Was vermisse ich?

Craig
quelle

Antworten:

124

Diese Zeile in development.rb stellt sicher, dass kein Caching stattfindet.

config.action_controller.perform_caching             = false

Sie können den Rails-Cache mit löschen

Rails.cache.clear

Das heißt - ich bin nicht davon überzeugt, dass dies ein Caching-Problem ist. Nehmen Sie Änderungen an der Seite vor und sehen Sie sie nicht reflektiert? Sie sehen sich vielleicht nicht die Live-Version dieser Seite an? Ich habe das einmal gemacht (erröten).

Aktualisieren:

Sie können diesen Befehl über die Konsole aufrufen. Sind Sie sicher, dass Sie die Anwendung in der Entwicklung ausführen?

Die einzige Alternative ist, dass die Seite, die Sie rendern möchten, nicht die Seite ist, die gerendert wird.

Wenn Sie die Serverausgabe beobachten, sollte der Renderbefehl angezeigt werden, wenn die Seite wie folgt gerendert wird:

Rendered shared_partials/_latest_featured_video (31.9ms)
Rendered shared_partials/_s_invite_friends (2.9ms)
Rendered layouts/_sidebar (2002.1ms)
Rendered layouts/_footer (2.8ms)
Rendered layouts/_busy_indicator (0.6ms)
Ein Kuchen
quelle
Diese Zeile ist in der Datei development.rb vorhanden. Wo füge ich diesen Befehl hinzu? Ja. Ich habe Änderungen an der Seite vorgenommen, die angezeigt werden sollte, wenn die Seite "live" war. Auf diese Weise habe ich das Caching-Problem entdeckt.
Craig
Es scheint ein idiotischer Fehler von meiner Seite gewesen zu sein. erröten Danke für deine Zeit und Hilfe - ich habe viel gelernt.
Craig
Kein Problem. Würde gerne wissen, was das Problem war - diese Dinge sind immer ziemlich dunkel - vor allem, wenn Sie einen idiotischen Fehler machen - ich glaube, ich werde bald das gleiche machen :)
Apie
1
Ich habe Routen für zwei verwandte Modelle verschachtelt. Auf einer Seite verwende ich den Pfad edit_parent_child_path im Link_to. Leider habe ich die Referenz der Eltern weggelassen; Es war edit_parent_child_path (child), es musste edit_parent_child_path (@ parent, child) sein.
Craig
"Sie sehen sich vielleicht nicht die Live-Version dieser Seite an? Ich habe das einmal gemacht (erröten)." LOL das ist mir gerade passiert haha
Robert Vunabandi
112

rake tmp:cache:clear könnte das sein, wonach Sie suchen.

Karen
quelle
1
Wenn die Umgebung etwas anderes als Entwicklung ist, müssen Sie hinzufügen (zum Beispiel Staging) - RAILS_ENV=staging bundle exec rake tmp:cache:clearsonst wird es wohl nicht funktionieren
Poorva
Dadurch werden nur Dateien aus dem Verzeichnis tmp / cache entfernt. Die Cache-Speicherdaten werden nicht gelöscht. stackoverflow.com/questions/19017983/…
Oshan Wisumperuma
25

Ich konnte dieses Problem beheben, indem ich meinen Assets-Cache bereinigte:

$ rake assets:clean
Dan
quelle
4

Suchen Sie in / public nach einer statischen Version Ihrer Seite und löschen Sie sie, falls vorhanden. Wenn Rails 3.x Seiten zwischenspeichert, bleibt eine statische Version in Ihrem öffentlichen Ordner und wird diese geladen, wenn Benutzer Ihre Site aufrufen. Dies bleibt auch nach dem Löschen des Caches bestehen.

David Harbage
quelle
Cache-Elemente in Rails 4 im /tmp/cache/Verzeichnis.
Ivan Chau
Das hat den Trick für mich getan. Ich bekam immer wieder eine Render-Seite, mit der ich neuen Code getestet habe. Die Serverkonsole meldete keine neuen Seiten, die ich angefordert hatte und die denselben Text rendern würden. Ich habe meinen Cache geleert und dachte, das sei das Problem, aber das hat nicht geholfen. Ich habe die Seite im öffentlichen Ordner gefunden, sie gelöscht und jetzt funktioniert sie ordnungsgemäß.
Reimus Klinsman
2

Wenn Sie Fragment-Caching durchführen , können Sie den Cache manuell unterbrechen, indem Sie Ihren Cache-Schlüssel wie folgt aktualisieren:

Version 1

<% cache ['cool_name_for_cache_key', 'v1'] do %>

Version 2

<% cache ['cool_name_for_cache_key', 'v2'] do %>

Oder Sie können den Cache basierend auf dem Status eines nicht statischen Objekts, z. B. eines ActiveRecord-Objekts, automatisch zurücksetzen lassen:

<% cache @user_object do %>

Mit dieser ^ Methode wird der Cache jedes Mal automatisch zurückgesetzt, wenn das Benutzerobjekt aktualisiert wird.

jeffdill2
quelle
Wie wäre es, wenn Sie nach Änderungen nur für einen bestimmten Fragment-Cache automatisch zurückgesetzt werden möchten?
Astm
@Astm, hier würden Sie die letzte Option verwenden - ein AR-Objekt als Teil Ihres Cache-Schlüssels haben. Wenn das updated_atgeändert wird, stimmt das AR-Objekt nicht mehr mit dem Cache-Schlüssel überein, wodurch das Fragment erneut zwischengespeichert wird.
Jeffdill2
Ich habe eine einfache Möglichkeit gefunden, den Cache automatisch zu löschen, wenn Änderungen mithilfe der Syntax <% cache (['User_Cache', user_object], expires_in: 1.hour) do%> vorgenommen werden. Wenn sich das user_object ändert, wird das automatisch aktualisiert Cache
Astm
1
@Astm richtig, das ist die letzte Option, die ich erwähnt habe, wenn ein AR-Objekt als Teil des Cache-Schlüssels verwendet wird.
jeffdill2
1

Esoterischere Wege:

Rails.cache.delete_matched("*")

Für Redis:

Redis.new.keys.each{ |key| Rails.cache.delete(key) }
Николай Агеев
quelle