以每格式&格式缓存操作的输出。每个用户的基础

时间:2010-01-20 03:12:37

标签: ruby-on-rails caching

Ryan Bates'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)
  3. 如何修改此方法,将当前用户和请求格式考虑在内?

1 个答案:

答案 0 :(得分:1)

该方法接受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