2014-11-05 13 views
6

Rails 4 verwendet cache_digests (https://github.com/rails/cache_digests) zur Unterstützung der Fragmentcache-Invalidierung: cache_digests erstellt einen MD5-Hash einer Vorlage und all ihrer bekannten Abhängigkeiten, wodurch Fragmentcaches ungültig werden, wenn ein neuer Schlüssel zugewiesen wird Vorlage oder ihre Abhängigkeit ändert sich.Rails 4-Fragment-Caching mit stylesheet_link_tag

Meine Frage ist: wird ein Fragment-Cache-Wrapping stylesheet_link_tag ungültig werden, wenn der MD5-Hash der application.css-Datei während rake assets:precompile ändert? Machen Sie das jetzt in unserem Header:

<% cache("header-cache-key") do %> 
    <%= stylesheet_link_tag "application" %> 
    <%= javascript_include_tag "application" %> 
<% end %> 

Ist das sicher? Meine Befürchtung ist, dass, wenn sich das CSS oder JS ändert, application-xxxxxxx.cssapplication-yyyyyyy.css wird, aber unser Header wird mit dem alten application-xxxxxxx.css zwischengespeichert. Dann, wenn application-xxxxxxx.css von public/assets gegangen ist, wird dies zu einer hässlichen Seite führen.

Antwort

1

Nein, der Cache wird bei Änderungen an kompiliertem CSS/JS nicht gesperrt/ungültig gemacht.

Die Art, wie Rails den Cache bei einer Codeänderung zerstört, wird durch Einfügen eines Hashes in den Cache-Schlüssel der Ansicht ausgeführt.

Zum Beispiel haben Sie eine View-Datei unter app/views/layouts/application.html.erb. Rails erzeugt aus dem Inhalt der Datei einen Hash (d. H. Den HTML/Ruby-Code, nicht die ausgeführte Ausgabe). Lassen Sie uns so tun, als ob der generierte Hash 'abdefg123' ist.

Wenn application.html.erb den folgenden Cache-Code hat:

<% cache("header-cache-key") do %> 
    <%= stylesheet_link_tag "application" %> 
    <%= javascript_include_tag "application" %> 
<% end %> 

Die eigentliche Schlüssel-Cache erzeugt wird, ist etwas entlang der Linien von "views/layouts/application-abcdefg123/header-cache-key".

Da eine Änderung in der kompilierten CSS/JS nicht wirklich den Ruby/HTML in der Datei ändert, ändert sich der berechnete Hash für den Layoutcode nicht und daher der Cacheschlüssel für 'header-cache-key' ist das gleiche, was bedeutet, dass der Cache nicht gesperrt ist.