Использование jQuery remove() с кэшированными страницами (бэкэнд Rails)

Я использую jQuery с бэкэндом Rails 3, и у меня есть следующий сценарий:

  1. Пользователь видит комментарий к своему сообщению и хочет его удалить.
  2. Пользователь нажимает кнопку удаления и удаляет комментарий из базы данных.
  3. jQuery использует remove() для удаления элемента из DOM в качестве успешного ответа AJAX на шаг 2 выше.
  4. Пользователь переходит на другую страницу
  5. Пользователь нажимает кнопку «Назад», чтобы вернуться на страницу с комментарием.
  6. Старый комментарий все еще там, хотя он был удален с сервера и из DOM.

Комментарий в этом сценарии, очевидно, кэшируется браузером, поэтому он отображается, даже если он был ранее удален (и его также нет на сервере).

Как предотвратить отображение комментария (или предыдущих кэшированных объектов, которые были удалены из DOM) при нажатии пользователем кнопки «Назад»?

Кстати: не говорите "не кэшировать страницы" :) Это не вариант.


person iwasrobbed    schedule 12.04.2011    source источник
comment
проверено на системе комментариев ютуба. Та же проблема, что и у вас :)   -  person Sufendy    schedule 16.04.2011
comment
ты обновляешь кеш при удалении поста? и какой тип кеширования вы используете страницу, действие или фрагмент?   -  person Naren Sisodiya    schedule 16.04.2011
comment
@Naren: сейчас мы используем базовое кэширование страниц и ничего не обновляем. Есть ли правильный способ сделать это или вы можете обновить только определенную часть страницы?   -  person iwasrobbed    schedule 16.04.2011
comment
да, если вы используете кеш страницы rails, вы должны очистить его при действиях «Создать», «Обновить» и «Удалить». см. guides.rubyonrails.org/caching_with_rails.html для получения дополнительной информации.   -  person Naren Sisodiya    schedule 16.04.2011
comment
@Нарен: спасибо! пожалуйста, добавьте свой ответ в качестве ответа ниже, и я отмечу его как принятый ответ   -  person iwasrobbed    schedule 16.04.2011


Ответы (3)


если вы используете кеш страницы rails, вам следует очистить его при действиях «Создать», «Обновить» и «Удалить». см. ссылку для более подробной информации.

person Naren Sisodiya    schedule 16.04.2011

Ответ первый: если пользователь использует кнопку «Назад», он не должен удивляться, увидев вещи из своего прошлого.

Ответ второй. Это немного сложно, но вы можете попробовать вызов ajax в $(document).ready(), который проверяет наличие устаревшего контента. Я не уверен, что это сработает. Если нет, вы можете установить интервал проверки связи с сервером, чтобы дважды проверить отсутствие устаревшего контента на экране. (У меня была хорошая производительность с частотой пинга до 7 секунд)

Я не думаю, что есть простой способ сделать это (кроме предотвращения кэширования;)

person Shad    schedule 12.04.2011
comment
Согласен с тем, что пользователь нажимает кнопку «Назад» и не удивляется. Это скорее приятно, чем необходимо, поскольку мы все равно перехватываем ошибку, если они пытаются удалить запись, которая уже была удалена. Я просто не хочу быть деспотичным :) Все равно спасибо за ваш вклад! - person iwasrobbed; 16.04.2011

Я не знаю, когда это зависит от браузера, и это может нарушить ваши маршруты RESTful, но что вы можете сделать, так это выполнить PUT/POST для того же URL-адреса, с которого было отправлено сообщение, и в Ответ AJAX отключает кеширование (используя заголовок Cache-Control). Он должен аннулировать этот URL-адрес в кеше браузера, поскольку браузеры обычно не различают использование глаголов HTTP.

person Roman    schedule 16.04.2011