我们使用Rails'caches_action
方法和Redis来实现常见页面的缓存。
这是一个非常动态的网站,因此具有不同网址参数的网页必须在缓存中保持不同(例如?page=1
与?page=2
)。但只要网址匹配,内容就可以缓存并提供给多个访问者。
由于我们流量的很大一部分来自Adwords广告,因此我们的许多用户都在URL中使用gclid参数进入我们的网页,这使得缓存无效。我通过从用于标识唯一URL的缓存路径中排除gclid来解决这个问题:
caches_action :search,
:expires_in => 10.minutes,
:cache_path => Proc.new { |c| c.params.except('gclid') }
这很有用,直到我意识到我们的Google Analytics数据已关闭,因为我们缓存的HTML包含了之前访问的gclid参数的内部链接。
因此解决方案非常简单 - 每次生成链接时我都需要手动排除gclid
,例如:
link_to 'some page', params.except('gclid')
我的问题是:有没有办法自动从所有生成的链接中排除gclid
?不必在整个站点中手动执行此操作非常方便。
答案 0 :(得分: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
This answer @jdc帮助我到达那里,就像@ MurifoX的评论一样。