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?

Craig
źródło

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)
Ciasto
źródło
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.

Loren
źródło
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
Dan
źródło
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.

David Harbage
źródło
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.

jeffdill2
źródło
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
1

Bardziej ezoteryczne sposoby:

Rails.cache.delete_matched("*")

W przypadku Redis:

Redis.new.keys.each{ |key| Rails.cache.delete(key) }
Николай Агеев
źródło