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.