我正在缓存此页面: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
中的超时参数?
答案 0 :(得分: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目录中的那些文件(或者你放置它们的任何地方 - 你可以使用正则表达式来匹配目录和文件与FileUtils),你需要清除/ tmp目录中的Rails缓存,这样就不会在控制器发出命令后,从那里拉出缓存。
答案 1 :(得分: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过期缓存“/ reviews / show”是行不通的,因为与缓存关联的密钥类似于“review_123”,但我可能错了。
答案 2 :(得分: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那样使用正则表达式。