【问题标题】:Rails action caching with querystring parameters带有查询字符串参数的 Rails 动作缓存
【发布时间】:2010-01-01 13:57:38
【问题描述】:

如果我的操作具有查询字符串参数,如何使用 Rails 缓存我的 REST 控制器?

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

谢谢!

【问题讨论】:

    标签: ruby-on-rails caching controller


    【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-09
        • 2016-07-10
        • 1970-01-01
        • 1970-01-01
        • 2011-01-16
        • 2011-11-20
        • 2011-05-05
        相关资源
        最近更新 更多