Wyczyść pamięć podręczną z potoku zasobów Rails

Zaczynam nowy projekt w Rails i wygląda jak aplikacja.js manifest file robi coś śmiesznego z javascripts, do których się odwołuję - czy buforuje te pliki jako część potoku zasobów?

Oto co się stało. Dodałem plik javascript o nazwie jquery.autoresize.js do folderu vendor / assets/javascripts, a następnie odwołuje się do pliku w aplikacji.js manifestuje się tak:
//= require jquery.autoresize.js 

Potem uruchomiłem serwer rails. Ale po nawigacji w mojej aplikacji zdałem sobie sprawę, że przypadkowo dodałem niewłaściwą wersję jquery.autoresize.plik js. Tak więc usunąłem ten plik, a następnie dodałem poprawną wersję do folderu vendor/assets / javascripts. Ale, ku mojemu przerażeniu, kiedy przeładowałem stronę, wciąż ładuje stary plik javascript.

Próbowałem opróżnić pamięć podręczną przeglądarki, a następnie wyjść i ponownie uruchomić serwer Rails, ale bezskutecznie. Zhakowałem rozwiązanie, po prostu zmieniając nazwę mojego pliku javascript i odwołując się do nowe nazwisko, które działało dobrze. Ale musi być na to lepsze rozwiązanie.

Czy nowy potok zasobów buforuje w jakiś sposób pliki, do których się odwołujesz? Jeśli tak, jak mogę wyczyścić tę pamięć podręczną? Dzięki za pomoc!

Author: Aaron Gray, 2012-04-04

5 answers

Zakładam, że mówimy o środowisku produkcyjnym.

Gdy zmieniasz Skrypty javascripts lub arkusze stylów w środowisku produkcyjnym, musisz uruchomić rake assets:precompile; to zadanie kompiluje i kompresuje różne .js i .pliki css i tworzy aplikację.js i aplikacji.pliki css, które są ładowane przez twoje widoki.

Jest możliwe, że jeśli zastąpisz jquery.autoresize.js wersją ze starszym znacznikiem czasu , krok precompile może go pominąć, myśląc, że wersja skompilowana jest aktualna. Możesz tego uniknąć, uruchamiając rake assets:clean najpierw, zmuszając ją do odbudowy wszystkiego w katalogu public/assets od zera.

 50
Author: benzado,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-05 23:22:52

Spróbuj również rake assets:clobber. Spowoduje to całkowite zresetowanie wszystkiego i usunięcie wszystkich skompilowanych zasobów. Ponadto często muszę ustawić środowisko przed rozpoczęciem produkcji, wybierając: RAILS_ENV=production rake assets:precompile.

 29
Author: Dex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-20 13:11:13

Rails automatycznie czyści pamięć podręczną dla pojedynczego pliku za każdym razem, gdy zawartość jest edytowana. aby wyczyścić pamięć podręczną dla pojedynczego pliku, po prostu otwórz plik, edytuj wiersz kodu i zapisz go ponownie. Rails wyczyści pamięć podręczną dla tego pliku, a przeglądarka załaduje nowy plik przy następnym załadowaniu strony.

Powód jquery.autoresize.js używał starej buforowanej wersji pliku, ponieważ stara wersja została usunięta, a następnie nowa wersja została skopiowane i wklejone z tą samą nazwą do tego samego folderu. Ponieważ sam plik nigdy nie był edytowany, Rails nadal używał starego pliku, który był buforowany.

Dzieje się tak dlatego, że potok zasobów używa odcisków palców dla pamięci podręcznej.

Fingerprinting jest techniką, która uzależnia nazwę pliku na zawartość pliku. Gdy zawartość pliku ulegnie zmianie, zmieniana jest również nazwa pliku. Dla treści, które są statyczne lub rzadko zmieniony, zapewnia to łatwy sposób aby stwierdzić, czy dwie wersje pliki są identyczne, nawet na różnych serwerach lub w różnych datach wdrożenia.

Gdy nazwa pliku jest unikalna i oparta na jego zawartości, nagłówki HTTP mogą być ustawione tak, aby zachęcać do buforowania wszędzie (czy w CDN, u ISP, w urządzeń sieciowych, lub w przeglądarkach internetowych), aby zachować własną kopię treść. Po zaktualizowaniu treści odcisk palca ulegnie zmianie. Spowoduje to, że zdalni klienci zażądają nowej kopii treść. Jest to na ogół znany jako Cache busting.

Technika, której używa Rails do fingerprintingu polega na wstawieniu hasha treści w nazwie, zwykle na końcu. Na przykład CSS plik globalny.css może być przemianowany z MD5 digest jego zawartości:

global-908e25f4bf641868d8683022a5b62f54.css

Tak więc, jeśli usuniesz plik, do którego odwołujesz się w manifeście, a następnie skopiujesz nowy plik o tej samej nazwie, burzenie pamięci podręcznej nigdy nie nastąpi. Podczas edycji pliku rozpoczyna się pobieranie odcisków palców i generowany jest nowy hash dla nazwy pliku. To powoduje usunięcie pamięci podręcznej dla tego pliku .

Aby uzyskać pełną wersję, Zobacz Co to jest pobieranie odcisków palców i dlaczego powinno mnie to obchodzić?.

 24
Author: Aaron Gray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-10 19:06:34

rake tmp:clear zrobiłem sztuczkę dla mnie, używam mniej szyn.

 7
Author: akz92,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-10 17:21:09

Używam config.assets.version = '1.01019' w moim application.rb, aby zniszczyć cały cache. Kiedy chcę wcisnąć kompletną nową wersję, zwiększam wersję i to robi sztuczkę. Zajmuje się to tymi przypadkami, w których Rails nie rekompiluje jako asset z jakiegokolwiek powodu.

 6
Author: user3670743,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-03 21:15:52