Кэширование страниц в Rails с поддоменом

Кто-нибудь успешно реализовал кеширование страниц рельсов с поддоменами?

Прямо сейчас один и тот же файл обслуживается между субдоменами, поскольку rails не распознает факт изменения субдомена.

Я бы хотел, чтобы кеш моих страниц выглядел примерно так:

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

Я использую nginx для обслуживания этих страниц, поэтому мне нужно будет изменить его конфигурационный файл, чтобы найти эти файлы после их кеширования, это не будет проблемой. Камнем преткновения для меня сейчас является конец рельсов.


person KJF    schedule 23.05.2012    source источник


Ответы (2)


Вам необходимо обновить расположение кеша в зависимости от того, какой субдомен используется.

Для этого вы можете добавить 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
person nickpellant    schedule 23.05.2012
comment
Кажется немного опасным изменять page_cache_directory на лету. Разве это не переменная класса? Меня беспокоит то, что два запроса могут поступить одновременно, что может привести к записи неправильного кеша для неправильного поддомена. - person KJF; 23.05.2012

Я использовал запись этого парня. (с небольшими изменениями)

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 не будет использовать существующий кеш страниц, если он существует, поскольку он не найдет его в пути по умолчанию.

person lulalala    schedule 03.07.2012