测试和生产环境中的ETag值不好

时间:2010-01-17 15:52:44

标签: ruby-on-rails http caching etag

我正在使用针对Rails的新缓存解决方案here

开发环境正常,但测试生产发送无效的ETag标头会忽略{{{ 1}}功能。

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

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 的{​​{1}}方法调用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" 每次保存时都会更改一个http://localhost:3000/admin/categories/,但测试生产却没有。

我用 webrick

测试了它

2 个答案:

答案 0 :(得分:2)

解决方案是Category.all方法在类级别缓存了结果,因此一旦获取它,就会为其余请求缓存所有内容。

开发环境中不存在,因为每次重新加载模型时都会因为config.cache_classes false {{1}}而在该环境中重新加载!

答案 1 :(得分:0)

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

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

此外,the article you quoted使用fresh?代替stale?,包括其他一些方法。你为什么不用那些?

修改:在查看updated link解决方案中的文章时,只需填写一个@category(与他们相同)。因此find最后修改的类别

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

并使用此值为ETag生成MD5 只有在渲染页面时才能获得@categories的完整列表。