Кэшируйте вывод действия для каждого формата и пользователя - PullRequest
0 голосов
/ 20 января 2010

Ryan Bates '1001 * render-caching gem хорош, но он кэширует записи по request_uri s:

def render_with_cache(key = nil, options = nil)
  key ||= request.request_uri     #  <----
  body = Rails.cache.read(key)
  if body
    render :text => body
  else
    yield if block_given?
    render unless performed?
    Rails.cache.write(key, response.body, options)
  end
end

Это неполное решение, так как то, что мое приложение выполняет дляданный URI варьируется в зависимости от:

  1. Текущий пользователь
  2. Формат запроса (html, js, atom)

Как изменитьэтот метод учитывает текущего пользователя и формат запроса?

1 Ответ

1 голос
/ 20 января 2010

Метод принимает аргумент key, поэтому вам не нужно его взламывать. Просто передайте имя своего кэша в качестве аргумента.

render_with_cache([current_user.id, request.format, request.uri].join("/")) do
  # ...
end

Если вы часто вызываете метод с этим аргументом, создайте новый метод, который оборачивает предыдущий.

def render_with_cache_scoped_by_user(key = nil, options = nil, &block)
  scoped_key = [current_user.id, request.format, request.uri]
  scoped_key << key unless key.blank?
  render_with_cache(scoped_key.join("/"), options, &block)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...