使用查询字符串参数的Rails操作缓存

40

如何在Rails中缓存带有查询字符串参数的REST控制器?

Example: GET /products/all.xml?max_price=200

谢谢!

3个回答

94

如果您想基于所有查询参数(或者几乎全部)对某个操作进行缓存,您可以执行以下操作:

caches_action :my_action, :cache_path => Proc.new { |c| c.params }

或者,也许你想获取除了一些仅用于分析(但对你正在获取的记录没有影响)的参数之外的所有参数:

caches_action :my_action, :cache_path => Proc.new { |c| c.params.delete_if { |k,v| k.starts_with?('utm_') } }

假设你的操作的用户名是John,并且基于传递的随机参数缓存了几个该用户的版本。有没有一种方法可以使得该用户的所有缓存及其参数都失效?例如,/john/picture?dimension=50 和 /john/picture?dimension=100,是否可能清除John图片的所有版本? - Marc
@Marc:是的,请参考命名空间的想法http://code.google.com/p/memcached/wiki/NewProgrammingTricks#Namespacing - randomguy
希望这能帮到某些人:在Rails 3中,当过期具有自定义参数、定义格式并且已将默认URL设置为确保尾随斜杠的操作缓存时,如果使用expire_action(:action => :my_action, :param_1 => "val", :format => :json)命令,则Rails不会使用正确的缓存键。它不会清除缓存键/my_action.json/?param_1=val,而是会清除/my_action.json/?param_1=val.json,因为它推断扩展名的方式不同。https://github.com/rails/rails/blob/3-2-stable/actionpack/lib/action_controller/caching/actions.rb#L179 - jkelley
3
当使用cache_path时,如何使动作过期? - xecutioner

14
为了将请求 URL 用作缓存键,我会这样做:
caches_action :index, :cache_path => Proc.new {|c| c.request.url }

4
在这种情况下,您应该使用片段缓存:
在您的控制器中:
cache(params[:max_price], :expires_in => 10.minute) do
  # get the result
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接