Ruby on Rails:キャッシュされたページをクリアする


81

開発環境でページをキャッシュしているRoRアプリケーション(ruby v1.8.7; rails v2.3.5)があります。これはそれほど問題にはなりませんが、キャッシュされたページのa要素は正しくありません。

development.rbファイルに変更を加えておらず、コントローラーにキャッシュコマンドを故意に追加していません。

このサイト(localhost)のブラウザ(OSX上のFirefox 3.5)のCookieとページキャッシュをクリアしようとしました。Mongrelも再起動しました。何も役に立たないようです。

何が足りないのですか?

回答:


125

development.rbのこの行は、キャッシュが発生しないことを保証します。

config.action_controller.perform_caching             = false

Railsキャッシュをクリアするには

Rails.cache.clear

そうは言っても、これがキャッシュの問題であるとは確信していません。ページに変更を加えても、反映されていないのですか?あなたはおそらくそのページのライブバージョンを見ていませんか?私は一度それをしました(赤面)。

更新:

コンソールからそのコマンドを呼び出すことができます。開発中のアプリケーションを実行していますか?

唯一の選択肢は、レンダリングしようとしているページがレンダリングされているページではないということです。

サーバーの出力を見ると、ページが次のようにレンダリングされたときに、renderコマンドを確認できるはずです。

Rendered shared_partials/_latest_featured_video (31.9ms)
Rendered shared_partials/_s_invite_friends (2.9ms)
Rendered layouts/_sidebar (2002.1ms)
Rendered layouts/_footer (2.8ms)
Rendered layouts/_busy_indicator (0.6ms)

その行はdevelopment.rbファイルにあります。そのコマンドはどこに追加しますか?はい。ページが「ライブ」の場合に表示されるはずのページに変更を加えました。これが、キャッシュの問題を発見した方法です。
craig 2010年

それは私の側のばかげた間違いだったようです。 赤面 あなたの時間と援助に感謝します-私はたくさん学びました。
craig 2010年

問題ない。問題が何であったかを知りたいです-これらのことは常にかなりあいまいです-何よりもあなたがばかげた間違いをしているとき-私はいつか同じものを作ることになっていると思います:)
Apie 2010年

1
2つの関連モデルのルートをネストしました。1つのページで、link_toのedit_parent_child_pathを使用します。残念ながら、私は親の参照を省略しました。それはedit_parent_child_path(child)であり、edit_parent_child_path(@ parent、child)である必要がありました。
craig 2010年

「あなたはおそらくそのページのライブバージョンを見ていませんか?私は一度それをしました(赤面)。」笑これはちょうど私に起こった
ハハ

113

rake tmp:cache:clear あなたが探しているものかもしれません。


1
環境は、開発以外のものであるならば、あなたは、(例えば、ステージング用)を追加する必要があります-RAILS_ENV=staging bundle exec rake tmp:cache:clearそう私はそれが動作しません推測する
poorva

これにより、tmp / cacheディレクトリからファイルが削除されます。キャッシュストアデータはクリアされません。stackoverflow.com/questions/19017983/...
Oshan Wisumperuma

25

アセットキャッシュをクリーンアップすることで、この問題を解決できました。

$ rake assets:clean

4

/ publicでページの静的バージョンを確認し、存在する場合は削除します。Rails 3.xがページをキャッシュすると、静的バージョンがパブリックフォルダーに残され、ユーザーがサイトにアクセスしたときにロードされます。これは、キャッシュをクリアした後も残ります。


Rails 4では、/tmp/cache/ディレクトリにあるアイテムをキャッシュします。
Ivan Chau

これは私にとってトリックでした。新しいコードをテストするために使用していたレンダリングページを取得し続けました。サーバーコンソールは、同じテキストをレンダリングする、私が要求していた新しいページを報告していませんでした。それが問題だと思ってキャッシュをクリアしましたが、それは役に立ちませんでした。パブリックフォルダでページを見つけて削除したところ、正常に機能するようになりました。
Reimus Klinsman 2015

2

フラグメントキャッシュを実行している場合は、次のようにキャッシュキーを更新することで手動でキャッシュを解除できます。

バージョン#1

<% cache ['cool_name_for_cache_key', 'v1'] do %>

バージョン#2

<% cache ['cool_name_for_cache_key', 'v2'] do %>

または、次のように、ActiveRecordオブジェクトなどの非静的オブジェクトの状態に基づいてキャッシュを自動的にリセットすることができます。

<% cache @user_object do %>

この^メソッドを使用すると、ユーザーオブジェクトが更新されるたびに、キャッシュが自動的にリセットされます。


特定のフラグメントキャッシュのみを変更した後、自動的にリセットしたい場合はどうでしょうか。
ASTM

最後のオプションを使用する場所である@ Astm–キャッシュキーの一部としてARオブジェクトを使用します。ときにupdated_at変更され、ARオブジェクトは、もはやフラグメントが再キャッシュされるようになりますキャッシュのキーと一致しません。
jeffdill2

構文<%cache(['User_Cache'、user_object]、expires_in:1.hour)do%>を使用して、変更が発生した場合にキャッシュを自動的にクリアする簡単な方法を見つけました。user_objectに変更がある場合は、自動的に更新されます。キャッシュ
ASTM

1
@Astmそうです、これが、キャッシュキーの一部としてARオブジェクトを使用することについて述べた最後のオプションです。
jeffdill2

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.