测试和生产环境中的 ETag 值错误
-
21-09-2019 - |
题
我正在使用新的 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
方法设置 etag
的 Response
对象,其代码如下:
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_classes
是false
因为重载!
其他提示
我不知道标题行/参数是否有最大值,但是对于很多类别,ETag 值会变得很长,正如您的示例所示。
您可以找到最新的修改日期并将其用于 ETag,而不是创建包含所有创建/修改日期的大字符串。
此外 你引用的文章 用途 fresh?
代替 stale?
包括其他一些方法。你为什么不使用那些?
编辑: 当你看你的文章时 更新的链接 解决方案似乎是只填写一个 @category
(和他们一样)。所以 寻找 最后修改的类别
@category = Category.find(:first, :order => 'date DESC')
并使用该值生成 ETag 的 MD5。
获取完整列表 @categories
仅当您正在渲染页面时。
不隶属于 StackOverflow