Rails页面缓存与子域

时间:2012-05-23 08:21:03

标签: ruby-on-rails ruby-on-rails-3 caching subdomain

是否有人成功实施了带子域的rails页面缓存?

现在,子域之间正在提供相同的文件,因为rails无法识别子域已更改的事实。

我希望我的网页缓存看起来像这样:

/public/cache/subdomain1/index.html
/public/cache/subdomain1/page2.html
/public/cache/subdomain2/index.html
/public/cache/subdomain2/page2.html

我使用nginx来提供这些页面,因此需要更改它的配置文件,以便在缓存后找到这些文件,这不会成为问题。我现在的关键点在于轨道末端。

2 个答案:

答案 0 :(得分:1)

您需要根据正在使用的子域更新缓存位置。

您可以添加before_filter来执行此操作。

一个例子是:

class ApplicationController < ActionController::Base
  before_filter :update_cache_location

  def update_cache_location
    if current_subdomain.present?
      ActionController::Base.page_cache_directory = "#{Rails.public_path}/cache/#{current_subdomain.directory_name}"
    end
  end
end

答案 1 :(得分:1)

我使用了这个人的post(经过一些修改)

class ApplicationController < ActionController::Base

  # Cache pages with the subdomain
  def cache_page(content = nil, options = nil, gzip = Zlib::BEST_COMPRESSION)
    path = [nil, request.subdomains, nil].join("/") # nil would add slash to 2 ends
    path << case options
    when Hash
      url_for(options.merge(:only_path => true, :skip_relative_url_root => true, :format => params[:format]))
    when String
      options
    else
      if request.path.empty? || request.path == '/'
        '/index'
      else
        request.path
      end
    end
    super(content, path, gzip)
  end

然后只使用通常的caches_page类方法。

这样做的结果是,我也需要破解expire_page(帖子中没有提到)。如果存在,Rails也不会使用现有的页面缓存,因为它不会在默认路径中找到它。