2013-04-22 39 views
0

我们使用Rails的caches_action方法和Redis来实现常用页面的缓存。 这是一个非常动态的站点,因此具有不同URL参数的页面必须在缓存中保持不同(例如,?page=1?page=2)。但只要网址匹配,内容就可以缓存并提供给多个访问者。默认情况下,我如何从Rails生成的链接中排除某些参数?

由于我们很大一部分流量来自Adwords广告,因此我们的许多用户都到达了我们的页面,URL中有一个gclid参数,导致缓存无效。我工作围绕这排除从使用的缓存路径的GCLID识别唯一URL:

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

这一段伟大的工作,直到我意识到我们的分析数据了,因为我们在缓存的HTML包括内部链接与以前访问的gclid参数。

所以,要解决这个是非常straightforward-每次我生成一个链接,我需要手动排除gclid,如时间:

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

我的问题是:有没有办法自动排除所有产生gclid链接?如果不必在整个站点手动执行此操作,这将非常方便。

+0

也许猴子补丁'link_to'方法通过添加你的这一行。 – MurifoX 2013-04-22 14:28:11

+0

是的,我想过修补link_to。但是我也必须修补url_for以及其他一些类似的方法。 – 2013-04-22 14:41:19

回答

0

这是我想出来的。通过@jdc帮助我到达那里,就像@ MurifoX的评论原来,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

相关问题