2009-08-02 1 views
2

다음은 설정입니다. 본질적으로 간단한 CMS 인 웹 사이트가 있습니다.루트 URL에 대한 작업 캐시가 작동하지 않습니다.

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 

그래서 방문자 히트 "/"는이 매핑 => 컨트롤러 ", 페이지 : 행동 =>"쇼 여기에 경로 파일입니다 , : 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:[email protected]/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:[email protected]/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] 

참조하십시오. 레일스는 "index"라는 캐시를 지우지 만 그것을 "/"로 설정합니다. 당연히 캐시가 지워지지 않으므로 방문자는 이전 버전을보고 있습니다.

+0

조각 캐싱으로 전환 했으므로 더 이상 문제가되지 않지만 여전히 레일스의 버그를 의심합니다. – askegg

답변

0

나는 액션 캐싱을 사용하지 않은,하지만 난 페이지를 캐시하는 경우 등 "/ 글/색인"으로 페이지 캐싱을 사용하고 나 또한 내 root_url은 레일 양쪽으로 캐시됩니다 있는지 확인 알고 :

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

둘 다 만료하려면 내 스위퍼에서 내가해야 할 :

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

그래서 아마 expire_action은 단지 문자열 경로 인수 걸릴까요?