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

4

3 回答 3

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 缓存,以便它不会拉在控制器发出命令后从那里缓存。

于 2012-10-22T16:21:02.093 回答
0

您是否尝试过为每条评论指定明确的路径?expire_page 需要您存储缓存的完整路径(但不是参数):

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 这样的正则表达式。

于 2012-10-27T10:31:43.600 回答
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”,但我可能错了。

于 2012-10-24T09:01:28.103 回答