0

我们使用 Rails 的caches_action方法和 Redis 来实现普通页面的缓存。这是一个非常动态的站点,因此具有不同 URL 参数的页面必须在缓存中保持不同(例如?page=1vs ?page=2)。但只要 URL 匹配,内容就可以被缓存并提供给多个访问者。

由于我们很大一部分流量来自 Adwords 广告,我们的许多用户在访问我们的页面时在 URL 中使用了gclid参数,这使得缓存毫无用处。我通过从用于识别唯一 URL 的缓存路径中排除 gclid 来解决此问题:

caches_action :search,
              :expires_in => 10.minutes,
              :cache_path => Proc.new { |c| c.params.except('gclid') }

这工作了一段时间,直到我意识到我们的 Analytics 数据已关闭,因为我们缓存的 HTML 包含来自以前访问的 gclid 参数的内部链接。

因此,解决方案非常简单——每次生成链接时,我都需要手动 exclude gclid,例如:

link_to 'some page', params.except('gclid')

我的问题是:有没有办法自动gclid从所有生成的链接中排除?不必在整个站点中手动执行此操作会非常方便。

4

1 回答 1

0

这就是我想出的。事实证明,无论如何link_to最终都会调用url_for,所以这似乎是连接它的最佳位置。

module ActionDispatch
  module Routing
    module UrlFor
      alias :original_url_for :url_for
      def url_for(options = {})
        options = options.except(:gclid) if options.kind_of? Hash
        original_url_for options
      end
    end
  end
end

@jdc helper 我的这个答案和@MurifoX 的评论一样。

于 2013-04-22T16:10:05.447 回答