Как настроить caches_action для работы с несколькими форматами?

У меня есть действие rails, которое отвечает на запросы в различных форматах, включая запросы AJAX, например:

   def index
    # do stuff
    respond_to do |format|
      format.html do
        # index.html.erb
      end
      format.js do
        render :update do |page|
          page.replace_html 'userlist', :partial => "userlist", :object=>@users
          page.hide('spinner')
          page.show('pageresults')
        end
      end
    end
   end

Я установил это действие для кэширования с использованием memcached, используя:

 caches_action :index, :expires_in=>1.hour, :cache_path => Proc.new { |c| "index/#{c.params[:page]}/#{c.request.format}" }

Этот шаблон отлично работает для кэширования результата HTML, но не для результата JS. Часть JS всегда работает нормально, когда она не поступает из кеша. Однако при попадании в кеш страница не обновляется.

Что может быть причиной этого и как исправить?

Обновление: копаясь в этом больше, похоже, что запросы из кеша получают тип mime «текст/html» вместо «текст/javascript». Однако я не уверен, как это исправить - это причуда memcached? (Рельсы 2.3.2)


person frankodwyer    schedule 27.09.2009    source источник


Ответы (3)


Подобно ответу волди, но с использованием неустаревших методов.

caches_action :show,
              :cache_path => :post_cache_path.to_proc,
              :expires_in => 1.hour

protected

def post_cache_path
  if request.xhr?
    "#{request.url}.js"
  else
    "#{request.url}.html"
  end
end
person Philip Cunninghm    schedule 07.05.2012

Я думаю, что у меня похожая проблема, я столкнулся с тем, что если я перенесу блок рендеринга: обновления в файл rjs, запрос будет намного быстрее. Если я сделаю такой рендеринг, время отклика составит около 8 секунд, после перехода на шаблон rjs оно составит 80 мс. Я не особо разбираюсь в memcached, но мне кажется, что он умеет только кешировать представления, если у вас есть мысли по поводу кеширования контроллера поделитесь со мной.

person dombesz    schedule 18.12.2009

Существует проблема в рельсах даже в версии Edge (3.0.1).

Я мог бы обойти это с помощью этого:

  caches_action :show, :cache_path => :show_cache_path.to_proc

  private

  def show_cache_path
    if request.accepts[0].to_sym == :html
      "#{request.host_with_port + request.request_uri}.html"
    else
      "#{request.host_with_port + request.request_uri}.js"
    end
  end
person Voldy    schedule 08.11.2010