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

リソースの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

私の意見では、キャッシュに関連付けられたキーが「review_123」のようなものであるため、Railsにキャッシュ「/ reviews / show」を期限切れにするように要求することはできませんが、間違っている可能性があります。

于 2012-10-24T09:01:28.103 に答える
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*\//,"")'

NB は、保存してデバッグしているキーを調べるためだけのものです。次に、照合するキー パターンがわかっている場合は、ページ キャッシュ全体 (すべてのキャッシュではなく、ページ キャッシュのみ) をクリアするファイル システムのスイーパーを使用して、そのパターンを期限切れにすることができます。残念ながら、expire_page は expire_fragment のような正規表現を取りません。

于 2012-10-27T10:31:43.600 に答える