当memcached中有命中时,如何让caches_action设置expires头?

我有一个缓存使用的动作

caches_action :my_action, :expires_in=>1.hours 

并使用在动作本身设置过期标题

 def my_action ... expires_in 1.hours send_data(...,:disposition => 'inline',:type => 'image/png',:filename => params[:title]+".png") end 

但是,当我查看来自memcached命中结果的结果的缓存控制响应头时,我得到:

 Cache-Control: private, max-age=0, must-revalidate 

第一轮,即当缓存中没有任何内容时,它就是我所期望的,即:

 Cache-Control: max-age=3600, private 

看起来rails + memcached既不缓存原始响应头,也不设置适当的头本身。 结果是,即使结果(图像)没有改变,客户端每次都向服务器发出请求。 尽管该操作在缓存中受到快速响应时很快就会完成,但它仍然会再次发送所有数据,这是我想避免的。

如何让标题做正确的事情,以便客户端首先不发出请求,或者获得“未修改”的响应?

几天前我遇到了同样的问题。 调试它似乎rails没有考虑到caches_action的expires_in。

我发现有效的方法是将相同的内容放在cache_path中。 例如,做了

 caches_action :monthly_sales_by_category, :expires_in => 10.minutes, :cache_path => proc { |c| category = c.params[:category] {:cat => category} } 

我做的是以下

 caches_action :monthly_sales_by_category, :cache_path => proc { |c| expires_in 10.minutes, :public => false category = c.params[:category] {:cat => category} } 

并且像一个魅力。 🙂

确保您的环境配置为支持缓存。 所以在config / environments / development.rb(或者在哪里)你应该看到:

 config.action_controller.perform_caching = true 

此外,私有缓存标记告诉中间缓存服务器不存储内容。 默认情况下这是安全的。 如果要更改此行为,只需将缓存设置为:

 expires_in(1.hours, :private => false, :public => true) 

如果内容未更改,为了跳过服务器上昂贵的处理,请使用:

 if stale?(:etag => @model, :last_modified => @model.updated_at.utc) # Expensive stuff in here. respond_to do |format| ... end end