我正在使用针对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 和瘦
测试了它答案 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
的完整列表。