web-dev-qa-db-ja.com

Rails)のフラグメントキャッシュを手動でクリアする

Rails 3.1アプリにHerokuでMemcachedを使用しています。バグがあり、間違ったものが表示されています。キャッシュのパラメーターが正しくありませんでした。

私はこれを持っていました:

<% cache("foo_header_cache_#{@user.id}") do %> 

フラグメントキャッシュを削除してHerokuにプッシュすると、不良データはなくなりました。

そして、私はそれを次のように変更しました:

<% cache("foo_header_cache_#{@foo.id}") do %> 

ただし、パラメータを@userから@fooに修正すると、(正しいデータで更新する代わりに)古い[誤った]キャッシュバージョンが再び表示されました。

これを手動で期限切れにする、または表示されているこの不良データを取り除くにはどうすればよいですか?

22
yellowreign

Railsコンソールに移動し、次のコマンドを使用して、キャッシュ全体を手動でクリアすることになりました。

Rails.cache.clear
40
yellowreign

Railsコンソールから:

Rails.cache.delete 'FRAGMENT-NAME'
24
John Kloian

はい、どうぞ:

<% ActionController::Base.new.expire_fragment("foo_header_cache_#{@user.id}") %>

参照:
- Rails Observer/Model? からexpire_fragmentを呼び出す方法

21
Adit Saxena

コンソールから:

これを実行できます(つまり、IDが「1」であることがわかっている場合)

ActionController::Base.new.expire_fragment("foo_header_cache_1")

Rails.cache.deleteを使用するには、フラグメント名を知っている必要があります。あなたの場合、それは

Rails.cache.delete("views/foo_header_cache_1") # Just add 'views/' to the front of the string

次のようなオブジェクトを使用する配列ベースのキャッシュキーがある場合:

cache([:foo_header_cache, @user])

次に、そのようにフラグメント名を取得できます

ActionController::Base.new.fragment_cache_key([:foo_header_cache, @user])

名前には、任意のオブジェクトから(yyyymmddhhmmssまでの)idおよびupdated_at時間が含まれます。 「views/foo_header_cache/users/1-20160901021000」のようになります

または、配列を使用してクリアします。

ActionController::Base.new.expire_fragment([:foo_header_cache, @user])
10
Mark Swardstrom