如何在rails中为不同的URL使用相同的缓存页面?

时间:2011-11-08 16:11:50

标签: ruby-on-rails-3 caching

我有两个基本上呈现同一页面的网址。根据{{​​1}},可以通过javascript轻松执行细微差异。无论如何,即使路由指向相同的location.href,第二条路线也不使用前者缓存的页面。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

我的网站对你有一个有趣的要求 - 由于主题不同,可以从同一个网址返回不同的页面。所以我提出了一个名为“匿名缓存”的解决方案,我创建了自己的缓存密钥,包括额外的参数。但我认为这个解决方案可以为您提供一些线索。

module AnonymousCache
  def self.included(base)
    base.extend(ClassMethods)
  end
  module ClassMethods
    def caches_page_for_anonymous(*pages)
      before_filter :check_cache_for_anonymous, :only => pages
      after_filter :cache_for_anonymous, :only => pages
    end
  end
  def check_cache_for_anonymous
    return unless perform_caching 
    return if logged_in? 
    path = anon_cache_path

    if content = Rails.cache.read(path)
      send_data(content,
        :type => 'text/html;charset=utf-8', :disposition => 'inline')
      return false
    end
  end
  def cache_for_anonymous
    return unless perform_caching
    return if logged_in? 
    path = anon_cache_path
    @expires_in ||= 1.hour
    self.class.benchmark "Cached page for guest: #{path}" do
      Rails.cache.write(path, response.body, :expires_in => @expires_in.to_i)
    end
  end
  protected :check_cache_for_anonymous
  protected :cache_for_anonymous
  private
    def anon_cache_path()
      path1 = File.join(request.host, current_theme, request.path)
      q = request.query_string
      path1 = "#{path1}?#{q}" unless q.empty?
      path1
    end
end

anon_cache_path方法是我为页面缓存制作规范键的方法。您可以看到我在其中加入了current_theme

您可以复制此内容并根据您的要求更改anon_cache_path