2010-01-17 26 views
1

我正在使用新的缓存解决方案Rails here在测试和生产环境中的坏ETag值

发展环境工作正常,但测试生产发送无效ETag头忽略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 

ActionController::Basestale?方法调用fresh_when方法,其设置Response对象,它具有下面的代码的etag

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测试生产它没有。

我已经与的WEBrick和测试它

+0

cache_key是**不等于最终的'ETag'值! – 2010-01-18 10:30:06

+0

'ETag'的值不是无效的,它只是保持与前一个请求的值相同 – 2010-01-18 11:03:23

回答

2

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

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

+0

这就是为什么ETag没有被更新 – 2010-01-18 16:07:50

0

我不知道是否有在标题行/参数的最大值,但有很多类别的ETag值变得很长,如你的例子已经显示。

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

此外the article you quoted使用fresh?而不是stale?包括一些其他方法。你为什么不使用这些?

编辑:当你updated link溶液中的文章看似乎是,以填补在短短一个@category(同他们这样做)。因此find最后修改类别

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

,并使用这个值来生成MD5用于ETag的。
仅当您正在渲染页面时,才能获得完整列表@categories

+0

Rails在'expand_cache_key'的结果上调用MD5校验和,所以这不成问题。这个MD5校验和保证'ETag'参数每次都有相同的长度。 – 2010-01-18 09:05:55

+0

对不起,链接不好的文章,我现在修复它。 – 2010-01-18 09:09:01

+0

但是我认为最好找到带有最新修改日期的类别。因为它基本上定义了ETag是否应该更改,并且保存(大量)从数据库发送到应用程序的数据。 – Veger 2010-01-18 10:01:51

相关问题