2009-08-02 10 views
2

Hier ist das Setup. Ich habe eine Website, die im Wesentlichen ein einfaches CMS ist. Hier ist die Routen-Datei:Aktion Cache für Root-URL funktioniert nicht

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

Die Seite Controller ist somit:

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 

Also, wenn ein Besucher Hits "/" es abbildet: controller => "Seiten: action =>" show ,: url => "/". Dies erzeugt beim ersten Versuch eine zwischengespeicherte Version und gibt danach das entsprechende Ergebnis zurück. Die Protokolldateien zeigen:

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/] 

OK - alles gut so weit. Wenn ich die Seite aktualisiere, sollte der Cache ablaufen (siehe oben). Die Protokolle zeigen:

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] 

Sehen Sie das Problem? Rails löscht den Cache mit dem Namen "index", setzt ihn jedoch auf "/". Dies führt natürlich dazu, dass der Cache NICHT gelöscht wird, so dass die Besucher nun die alte Version sehen.

+0

Ich wechselte zu Fragment-Caching, so dass dies kein Problem mehr ist, aber ich vermute immer noch einen Fehler in Rails hier. – askegg

Antwort

0

Ich habe nicht Aktion Caching verwendet wird, aber ich weiß, dass Seiten-Caching verwenden, wenn ich eine Seite wie „/ posts/index“ cachen und ich mache auch, dass meine root_url, Rails als beide zwischengespeichert werden:

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

um sie beide in meinem Kehrmaschine verfallen ich tun muss:

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

So vielleicht wird expire_action auch einen String Pfad arg nehmen gerade?

Verwandte Themen