由于自定义路由,无法使页面过期

时间:2012-10-18 18:54:15

标签: ruby-on-rails caching

我正在缓存此页面: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 个答案:

答案 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那样使用正则表达式。