默认情况下,如何从Rails生成的链接中排除某些参数?

时间:2013-04-22 14:25:40

标签: ruby-on-rails-3

我们使用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?不必在整个站点中手动执行此操作非常方便。

1 个答案:

答案 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的评论一样。