Кэш действий для корневого URL не работает - PullRequest
2 голосов
/ 02 августа 2009

Вот настройки. У меня есть веб-сайт, который по сути является простой CMS. Вот файл маршрутов:

map.connect ':url', :controller => :pages, :action => :show
map.root :controller => :pages, :action => :show, :url => "/"

Контроллер страницы выглядит так:

class PagesController < ApplicationController
  before_filter :verify_access, :except => [:show]

  # Cache show action if we are not logged in.
  caches_action :show, :layout => false, :unless => Proc.new { |controller| controller.logged_in? }

  def update
    @page = Page.find(params[:id])

    respond_to do |format|
      expire_action :action => :show, :url => @page.url

Таким образом, когда посетитель нажимает "/", он отображается на: controller => "pages,: action =>" show,: url => "/". Это создает кэшированную версию с первой попытки, а затем возвращает соответствующий результат после. Файлы журнала показывают:

Processing PagesController#show (for 127.0.0.1 at 2009-08-02 14:15:01) [GET]
  Parameters: {"action"=>"show", "url"=>"/", "controller"=>"pages"}
Cached fragment hit: views/out.local// (0.1ms)
Rendering template within layouts/application
Filter chain halted as [#<ActionController::Filters::AroundFilter:0x23eb03c @identifier=nil, @method=#<Proc:0x01904858@/Library/Ruby/Gems/1.8/gems/actionpack-2.3.3/lib/action_controller/caching/actions.rb:64>, @kind=:filter, @options={:only=>#<Set: {"show"}>, :if=>nil, :unless=>#<Proc:0x025137ac@/Users/askegg/Sites/out/app/controllers/pages_controller.rb:6>}>] did_not_yield.
Completed in 2ms (View: 1, DB: 0) | 200 OK [http://out.local/]

ОК - пока все хорошо. Когда я обновляю страницу, она должна заканчиваться кешем (см. Выше). Логи показывают:

  Page Load (0.2ms)   SELECT * FROM "pages" WHERE ("pages"."id" = 3) 
  Page Load (0.1ms)   SELECT "pages".id FROM "pages" WHERE ("pages"."url" = '/' AND "pages".domain_id = 1 AND "pages".id <> 3) LIMIT 1
Expired fragment: views/out.local/index (0.1ms)
Redirected to http://out.local/pages/3
Completed in 9ms (DB: 0) | 302 Found [http://out.local/pages/3]

Видите проблему? Rails очищает кэш с именем «index», но устанавливает его как «/». Естественно, это приводит к тому, что кеш НЕ очищается, поэтому посетители теперь видят старую версию.

1 Ответ

0 голосов
/ 07 апреля 2010

Я не использовал кэширование действий, но я знаю, что используя кэширование страниц, если я кеширую страницу, такую ​​как "/ posts / index", и я также сделаю так, что мой root_url, Rails будет кэшировать его как:

RAILS_ROOT/public/index.html
RAILS_ROOT/public/posts/index.html

Чтобы истечь их оба, в моей подметальной машине я должен сделать:

expire_page :controller => 'posts', :action => 'index'
expire_page '/index'

Так, возможно, expire_action также просто примет строковый аргумент arg?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...