Ruby on Rails: Wyczyść buforowaną stronę


81

Mam aplikację RoR (Ruby v1.8.7; rails v2.3.5), która buforuje stronę w środowisku programistycznym. Nie stanowiłoby to większego problemu, ale aelementy strony w pamięci podręcznej są nieprawidłowe.

Nie wprowadziłem żadnych zmian w pliku development.rb i świadomie nie dodałem żadnych poleceń buforowania do kontrolerów.

Próbowałem wyczyścić pliki cookie przeglądarki (Firefox 3.5 na OSX) i pamięci podręczne stron dla tej witryny (localhost). Ponownie uruchomiłem też Mongrel. Wydaje się, że nic nie pomaga.

czego mi brakuje?

Odpowiedzi:


125

Ta linia w pliku development.rb zapewnia, że ​​buforowanie nie występuje.

config.action_controller.perform_caching             = false

Możesz wyczyścić pamięć podręczną Railsów za pomocą

Rails.cache.clear

To powiedziawszy - nie jestem przekonany, że jest to problem z pamięcią podręczną. Czy wprowadzasz zmiany na stronie i nie widzisz ich odzwierciedlenia? Być może nie patrzysz na aktywną wersję tej strony? Zrobiłem to raz (rumieniec).

Aktualizacja:

Możesz wywołać to polecenie z poziomu konsoli. Czy na pewno używasz aplikacji w fazie rozwoju?

Jedyną alternatywą jest to, że strona, którą próbujesz renderować, nie jest renderowaną stroną.

Jeśli oglądasz dane wyjściowe serwera, powinieneś być w stanie zobaczyć polecenie renderowania, gdy strona jest renderowana podobnie do tego:

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)

Ta linia jest obecna w pliku development.rb. Gdzie dodać to polecenie? Tak. Dokonałem zmian na stronie, która powinna była zostać wyświetlona, ​​gdyby strona była aktywna - w ten sposób odkryłem problem z pamięcią podręczną.
craig

Wygląda na to, że był to idiotyczny błąd z mojej strony. rumieniec Dzięki za poświęcony czas i pomoc - wiele się nauczyłem.
craig

Nie ma problemu. Chciałbym wiedzieć, na czym polegał problem - te rzeczy są zawsze dość niejasne - przede wszystkim, gdy popełniasz idiotyczny błąd - myślę, że wkrótce
popełnię

1
Zagnieżdżono trasy dla dwóch powiązanych modeli. Na jednej stronie używam edit_parent_child_path w link_to. Niestety, pominąłem odniesienie rodzica; była to edit_parent_child_path (child), musiała to być edit_parent_child_path (@ rodzic, dziecko).
craig

„Być może nie oglądasz aktualnej wersji tej strony? Zrobiłem to raz (rumieniec)”. LOL, to mi się po prostu przydarzyło haha
Robert Vunabandi

113

rake tmp:cache:clear może być tym, czego szukasz.


1
Jeśli środowisko jest czymś innym niż programistycznym, będziesz musiał dodać (na przykład staging) - w RAILS_ENV=staging bundle exec rake tmp:cache:clearprzeciwnym razie myślę, że to nie zadziała
poorva

spowoduje to po prostu usunięcie plików z katalogu tmp / cache. nie wyczyści danych magazynu pamięci podręcznej. stackoverflow.com/questions/19017983/…
Oshan Wisumperuma

25

Udało mi się rozwiązać ten problem, czyszcząc pamięć podręczną zasobów:

$ rake assets:clean

4

Sprawdź statyczną wersję swojej strony w / public i usuń ją, jeśli tam jest. Kiedy Rails 3.x buforuje strony, pozostawia statyczną wersję w twoim publicznym folderze i ładuje ją, gdy użytkownicy odwiedzają twoją witrynę. Pozostanie to nawet po wyczyszczeniu pamięci podręcznej.


W Railsach 4 buforuje elementy znajdujące się w /tmp/cache/katalogu.
Ivan Chau

To załatwiło sprawę dla mnie. Ciągle otrzymywałem renderowaną stronę, której używałem do testowania nowego kodu. Konsola serwera nie zgłaszała żadnych nowych stron, o które prosiłem, a które renderowałyby ten sam tekst. Wyczyściłem pamięć podręczną, myśląc, że to problem, ale to nie pomogło. Znalazłem stronę w folderze publicznym, usunąłem ją i teraz działa poprawnie.
Reimus Klinsman,

2

Jeśli robisz buforowanie fragmentów , możesz ręcznie zepsuć pamięć podręczną, aktualizując klucz pamięci podręcznej, na przykład:

Wersja 1

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

Wersja 2

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

Lub możesz automatycznie zresetować pamięć podręczną na podstawie stanu niestatycznego obiektu, takiego jak obiekt ActiveRecord, na przykład:

<% cache @user_object do %>

Dzięki tej metodzie za każdym razem, gdy obiekt użytkownika zostanie zaktualizowany, pamięć podręczna zostanie automatycznie zresetowana.


a co z chęcią automatycznego resetowania po zmianach tylko dla pamięci podręcznej określonego fragmentu?
Astm

@Astm to miejsce, w którym użyjesz ostatniej opcji - miej obiekt AR jako część klucza pamięci podręcznej. Po updated_atzmodyfikowaniu obiekt AR nie będzie już pasował do klucza pamięci podręcznej, co spowoduje ponowne odzyskanie fragmentu.
jeffdill2

Znalazłem łatwy sposób na automatyczne wyczyszczenie pamięci podręcznej, jeśli nastąpią jakiekolwiek zmiany, używając składni <% cache (['User_Cache', user_object], expires_in: 1.hour) do%> jeśli nastąpi jakakolwiek zmiana w user_object, automatycznie zaktualizuje cache
Astm

1
@Astm racja, to ostatnia opcja, o której wspomniałem, używając obiektu AR jako części klucza pamięci podręcznej.
jeffdill2

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.