我正在使用新的 Rails 缓存解决方案,如上所述 这里.

发展 环境很好,但是 测试生产 发送无效 ETag header 忽略的参数 stale? 功能。

这是我的一个控制器的相应部分:

def index
  @categories = Category.all

  if stale?(:etag => @categories)
    respond_to do |format|
      format.html
      format.xml  { render :xml => @categories }
      format.json { render :json => @categories }
    end
  end
end

stale? 的方法 ActionController::Base 称为 fresh_when 方法设置 etagResponse 对象,其代码如下:

def etag=(etag)
  if etag.blank?
    headers.delete('ETag')
  else
    headers['ETag'] = %("#{Digest::MD5.hexdigest(ActiveSupport::Cache.expand_cache_key(etag))}")
  end
end

Category 模型发送正确的 cache_key 如果我在每个环境中都得到它:

>> Category.find(1).cache_key
=> "categories/1-20100117153353"
>> ActiveSupport::Cache.expand_cache_key(Category.find(:all))
=> "categories/1-20100117153353/categories/2-20100117152007/categories/3-20100116094423/categories/4-20100116094423/categories/5-20100116094423/categories/6-20100116094423/categories/7-20100116094423/categories/8-20100117145800/categories/9-20100117145808"

所以我根本不明白发生了什么,因为当我选择 URL 时 http://localhost:3000/admin/categories/发展 环境、 ETag 每次保存时都会改变 Category 但与 测试 或者 生产 它不是。

我已经测试过了 韦伯里克薄的

有帮助吗?

解决方案

的解决方案是,该方法Category.all缓存在类级的结果,因此一旦被取出一切都被缓存,以用于请求的其余部分。

这是不存在的发展环境,因为每一次的模型,在这种环境中config.cache_classesfalse因为重载!

其他提示

我不知道标题行/参数是否有最大值,但是对于很多类别,ETag 值会变得很长,正如您的示例所示。

您可以找到最新的修改日期并将其用于 ETag,而不是创建包含所有创建/修改日期的大字符串。

此外 你引用的文章 用途 fresh? 代替 stale? 包括其他一些方法。你为什么不使用那些?

编辑: 当你看你的文章时 更新的链接 解决方案似乎是只填写一个 @category (和他们一样)。所以 寻找 最后修改的类别

@category = Category.find(:first, :order => 'date DESC')

并使用该值生成 ETag 的 MD5。
获取完整列表 @categories 仅当您正在渲染页面时。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top