Истекает срок действия всех кешей на контроллере - PullRequest
1 голос
/ 02 декабря 2010

Я получил изобретательный контроллер с настраиваемым действием. Действие довольно тяжелое, поэтому я работаю над его кэшированием:

class MyController < ApplicationController
  caches_action :walk_to_mordor

  # GET /my/:id/walk_to_mordor/:direction
  def walk_to_mordor
    # srz bzns
  end
end

Работает очень хорошо, кэширование выполнено, и страница теперь работает быстро. Тем не менее, я хочу разрешить пользователю «разрушать» кеш, нажав на ссылку на странице. Сначала я попробовал:

def bust_cache
  expire_action :action => :walk_to_mordor
end

Rails пожаловался, что ни один маршрут не соответствует моим действиям. Может быть из-за параметра. Хм, давай ему это:

def bust_cache
  MyEntities.all.each do |e|
    expire_action walk_to_mordor_path(e, ??)
  end
end

Проблема, я не могу определить все варианты :direction.

Есть ли способ очистить все кэши действий, которые соответствуют определенному регулярному выражению, или все кэши действий от определенного контроллера?

1 Ответ

2 голосов
/ 02 декабря 2010

Секрет называется expire_fragment:

expire_fragment (ключ, опции = ноль)

Удаляет фрагменты из кэша.

ключ может иметь одну из трех форм:

  • Строка - обычно она принимает форму пути, например "pages / 45 / notes".

  • Hash - трактуется как неявный вызов url_for, например {:controller => "pages", :action => "notes", :id => 45}

  • Regexp - удалит любой соответствующий фрагмент, поэтому %r{pages/d*/notes} может удалить все заметки. Убедитесь, что вы не используете якоря в регулярном выражении (^ или $), потому что фактическое имя файла соответствует ./cache/filename/path.cache. Примечание. Истечение срока действия регулярного выражения поддерживается только на кэшах, которые могут перебирать все ключи (в отличие от memcached).

http://api.rubyonrails.org/classes/ActionController/Caching/Fragments.html#method-i-expire_fragment

К сожалению, он не будет работать с memcached (если я когда-нибудь решу его использовать). Нужно быть намного умнее, чтобы избежать кеша в этом случае. Может быть, добавив параметр serial к запросу, и увеличивать его, когда пользователь нажимает кнопку 'bust cache' ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...