带有查询字符串参数的 Rails 动作缓存
Posted
技术标签:
【中文标题】带有查询字符串参数的 Rails 动作缓存【英文标题】:Rails action caching with querystring parameters 【发布时间】:2010-01-01 13:57:38 【问题描述】:如果我的操作具有查询字符串参数,如何使用 Rails 缓存我的 REST 控制器?
Example: GET /products/all.xml?max_price=200
谢谢!
【问题讨论】:
【参考方案1】:如果你想缓存一个动作,基于所有的查询参数(或者说几乎所有的参数),你可以这样做:
caches_action :my_action, :cache_path => Proc.new |c| c.params
或者,您可能只需要一些仅用于 Analytics 的参数(但与您正在获取的记录无关):
caches_action :my_action, :cache_path => Proc.new |c| c.params.delete_if |k,v| k.starts_with?('utm_')
【讨论】:
假设该动作有用户名 john,并且您已经根据传入的随机获取参数缓存了几个版本。有没有办法使使用用户名 john 和所有缓存的动作的缓存无效带参数的版本?示例 /john/picture?dimension=50 和 /john/picture?dimension=100 是否可以清除所有版本的 johns 图片? @Marc:是的,请参阅命名空间以获取想法code.google.com/p/memcached/wiki/… 希望这对某人有所帮助:在 Rails 3 中,当一个具有自定义参数的动作缓存过期时,定义了一种格式,并且您已设置默认 URL 以确保尾部斜杠,expire_action(:action => :my_action, :param_1 => "val", :format => :json),rails 没有使用正确的缓存键。由于它推断扩展名的方式,它将清除 /my_action.json/?param_1=val.json 而不是清除缓存键 /my_action.json/?param_1=val。 github.com/rails/rails/blob/3-2-stable/actionpack/lib/… 那么在使用 cache_path 时如何使操作过期?【参考方案2】:要将请求 url 用作缓存键,我会这样做:
caches_action :index, :cache_path => Proc.new |c| c.request.url
【讨论】:
【参考方案3】:在这种情况下,您应该使用片段缓存:
在您的控制器中:
cache(params[:max_price], :expires_in => 10.minute) do
# get the result
end
【讨论】:
以上是关于带有查询字符串参数的 Rails 动作缓存的主要内容,如果未能解决你的问题,请参考以下文章
如何清除 Rails 动作缓存? (Rails.cache.clear 不起作用)
Rails:在 link_to 中保留 GET 查询字符串参数