Ruby on rails 按格式缓存操作的输出&;按用户计算

Ruby on rails 按格式缓存操作的输出&;按用户计算,ruby-on-rails,caching,Ruby On Rails,Caching,Ryan Bates的gem很不错,但它通过request\u uris为缓存条目设置键: 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? rend

Ryan Bates的gem很不错,但它通过
request\u 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
def render_与_缓存(key=nil,options=nil)
key | |=request.request_uri#body
其他的
如果给定块_,收益率是多少?
除非执行,否则渲染?
Rails.cache.write(key、response.body、options)
结束
结束
这是一个不完整的解决方案,因为我的应用程序为给定URI呈现的内容根据以下情况而变化:

  • 当前用户
  • 请求的格式(html、js、atom)

  • 如何在考虑当前用户和请求格式的情况下修改此方法?

    此方法接受一个
    参数,因此您无需对其进行破解。只需将缓存名称作为参数传递

    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
    
    def render_与_cache_作用域由_用户定义(key=nil,options=nil,&block)
    作用域_键=[当前_user.id,request.format,request.uri]
    范围键