2012-10-18 36 views
1

我緩存此頁:match "/review_(:game_id)" => "reviews#show"不能過期頁面由於自定義路由

我的控制器看起來像:

class ReviewsController < ApplicationController 
    caches_page :show 

    def show 
    expires_in 1.week, :public => true 
    end 
end 

我想有一個rake任務來清理文件緩存每週的特定頁面,但expire_page似乎不適用於這一個,也許它期望一個完整的路徑?但我無法提供,因爲有數百場比賽。

task :expire_game_reviews => :environment do 
    ApplicationController.expire_page "/reviews/show" 
    puts "Cache cleared" 
end 

任何想法?或者更好的解決方法是在caches_page中指定一個超時參數?

回答

3

你說得對,expire_page不會在這個設置中刪減它。

解決方案是手動完成。由於沒有其他內容會清除此緩存,因此您需要自行移除這些文件。這很簡單:

task :expire_game_reviews => :environment do 
    cpath = ActionController::Base.page_cache_directory 

    unless cpath == Rails.root + "/public" 
    FileUtils.rm_r(Dir.glob(cpath + "/*")) rescue Errno::ENOENT 
    end 

    Rails.cache.clear 
end 

在/ public目錄中刪除這些文件(或其他任何地方,你把他們 - 你可以使用正則表達式匹配的目錄和文件與文件實用程序)後,需要清除的Rails緩存/ tmp目錄,以便它在控制器下達命令後不會從那裏取得緩存。

+0

難道不會清除所有緩存嗎? – Ryan

+0

是的。我的假設是,這是您進行頁面緩存的唯一途徑,因此這可能是您可以做出的妥協,因爲這是一週一次。 – instinctious

0

您是否嘗試過期顯式指定資源ID的頁面?

喜歡的東西:

task :expire_game_reviews => :environment do 
    Game.all.each do |game| 
    ApplicationController.expire_page "/review_#{game.id}" 
    puts "Cache cleared for review #{game.id}" 
    end 
end 

在我看來,要求的Rails到期緩存「/評論/秀」不行,因爲相關聯的緩存,關鍵是像「review_123」,但我可能是錯的。

0

您是否嘗試了每個評論的顯式路徑? expire_page需要你存儲下(但不是PARAMS)高速緩存的完整路徑:

expire_page(:controller => "reviews", :action => "show", :id => r.id) 

如果不工作,你可以找出鑰匙,你實際上是在文件緩存中存儲有這樣的事情:

find ./tmp/cache -type f | xargs ruby -e 'require "cgi";puts CGI::unescape(ARGV.sort.join("\n")).gsub(/.*tmp\/cache\/\w*\/\w*\//,"")' 

注意這只是爲了探索你正在存儲和調試的密鑰。然後,當您知道要匹配的關鍵模式時,您可以嘗試在清除整個頁面緩存的文件系統(不是全部緩存,只是頁面緩存)中使用清理程序來使其過期。不幸的是,expire_page不會像expire_fragment那樣使用正則表達式。