Ruby on Rails: очищення кешованої сторінки


81

У мене є програма RoR (ruby v1.8.7; rails v2.3.5), яка кешує сторінку в середовищі розробки. Це не була б такою проблемою, але aелементи кешованої сторінки неправильні.

Я не вносив жодних змін у файл development.rb, і я свідомо не додавав жодних команд кешування до контролерів.

Я спробував очистити файли cookie браузера (Firefox 3.5 на OSX) та кеші сторінок для цього сайту (localhost). Я також перезапустив Mongrel. Здається, ніщо не допомагає.

Чого мені не вистачає?

Відповіді:


125

Цей рядок у розробці.rb гарантує, що кешування не відбувається.

config.action_controller.perform_caching             = false

Ви можете очистити кеш Rails за допомогою

Rails.cache.clear

Тим не менш, я не впевнений, що це проблема кешування. Ви вносите зміни на сторінку і не бачите їх відображення? Ви, можливо, не переглядаєте версію цієї сторінки в режимі реального часу? Я зробив це один раз (почервоніти).

Оновлення:

Ви можете викликати цю команду з консолі. Ви впевнені, що запускаєте додаток у розробці?

Єдиною альтернативою є те, що сторінка, яку ви намагаєтеся відтворити, не є сторінкою, яка відображається.

Якщо ви переглядаєте вихідні дані сервера, ви зможете побачити команду render, коли сторінка відображається приблизно так:

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)

Цей рядок присутній у файлі development.rb. Де я можу додати цю команду? Так. Я вніс зміни на сторінку, яка повинна була відображатися, якщо сторінка була «живою» - так я виявила проблему кешування.
Крейг,

Здається, це була ідіотська помилка з мого боку. рум'яна Дякую за ваш час та допомогу - я багато чому навчився.
Крейг,

Нема проблем. Я хотів би знати, в чому проблема: ці речі завжди досить незрозумілі - найбільше, коли ви робите ідіотську помилку - я вважаю, що я зобов’язаний зробити таку саму десь найближчим часом :)
Апі

1
Я вклав маршрути для двох пов’язаних моделей. На одній сторінці я використовую шлях edit_parent_child_path у link_to. На жаль, я опустив посилання батьків; це був edit_parent_child_path (дочірній), він повинен бути edit_parent_child_path (@ батьків, дочірній).
Крейг,

"Ви, мабуть, не переглядаєте версію цієї сторінки в реальному часі? Я це зробив один раз (почервоніння)." LOL це зі мною щось трапилось ха-ха
Роберт Вунабанді

113

rake tmp:cache:clear може бути те, що ви шукаєте.


1
Якщо середовище є чимось іншим, ніж розробкою, тоді вам потрібно буде додати (наприклад, інсценізацію) - RAILS_ENV=staging bundle exec rake tmp:cache:clearінакше, я думаю, це не спрацює
бідна

це просто видалить файли з каталогу tmp / cache. це не очистить дані сховища кешу. stackoverflow.com/questions/19017983 / ...
Oshan Wisumperuma

25

Я зміг вирішити цю проблему, очистивши кеш своїх ресурсів:

$ rake assets:clean

4

Перевірте наявність статичної версії вашої сторінки в / public та видаліть її, якщо вона є. Коли Rails 3.x кешує сторінки, він залишає статичну версію у вашій загальній папці та завантажує її, коли користувачі потрапляють на ваш сайт. Це залишиться навіть після того, як ви очистите кеш.


У Rails 4 кешуйте елементи, розташовані в /tmp/cache/каталозі.
Іван Чау

Це зробило для мене фокус. Я постійно отримував сторінку візуалізації, яку використовував для тестування нового коду. Консоль сервера не повідомляла про нові сторінки, про які я запитував, які б відображали той самий текст. Я очистив кеш, думаючи, що проблема в цьому, але це не допомогло. Я знайшов сторінку в загальній папці, видалив її, і тепер вона працює належним чином.
Реймус Клінсман,

2

Якщо ви робите кешування фрагментів , ви можете вручну розбити кеш, оновивши ключ кешу, наприклад:

Версія No1

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

Версія No2

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

Або ви можете автоматично скинути кеш на основі стану нестатичного об’єкта, наприклад об’єкта ActiveRecord, приблизно так:

<% cache @user_object do %>

За допомогою цього методу ^ під час кожного оновлення об’єкта користувача кеш-пам’ять буде автоматично скинуто.


а як щодо того, щоб автоматично скидатись після змін лише для певного кешу фрагментів?
Astm

@Astm, де ви використовували б останній варіант - мати AR-об'єкт як частину ключа кешу. Коли updated_atмодифікується, об'єкт AR більше не буде відповідати ключу кешу, що призведе до повторного кешування фрагмента.
jeffdill2

Я знайшов простий спосіб очистити кеш автоматично, якщо відбудуться будь-які зміни, використовуючи синтаксис <% cache (['User_Cache', user_object], expires_in: 1.hour) do%> якщо в user_object є якісь зміни, він автоматично оновить кеш
Astm

1
@Astm правильно, це останній варіант, про який я згадав, використовуючи AR-об'єкт як частину ключа кешу.
jeffdill2

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.