レールで、掃除なというモデルのみ設定
-
13-09-2019 - |
質問
ようにレールアプリでは、私が使っているページのキャッシングに店を静的htmlに出力されます。のキャッシュに働きます。うまく消滅キャッシュをしました。
私の問題は、いをしてほしいほしいしてほしい消滅キャッシュからコントローラです。すべての行為に必要なことは内で取り扱わせています。このようなので可ものの、すべての参照モデルに基づくキャッシュの有効期限をしているところを探そうした日、またはその他で使用すれば問題ありません。
私の環境です。rbのファイル、私は呼び出し
config.load_paths += %W( #{RAILS_ROOT}/app/sweepers )
いの/掃除機のフォルダには、LinkSweeperファイル:
class LinkSweeper < ActionController::Caching::Sweeper
observe Link
def after_update(link)
clear_links_cache(link)
end
def clear_links_cache(link)
# expire_page :controller => 'links', :action => 'show', :md5 => link.md5
expire_page '/l/'+ link.md5 + '.html'
end
end
なので--- なぜなんでしを削除するキャッシュされたページの時更新のモデルかどうかを示します。 (プロセス:スクリプト/コンソール、僕の選択項目データベースから保存し、その対応するページなの削除をキャッシュから、私もの呼び出し特有の方法でのリンクモデルでは通常、この呼び出し、掃除.います。
な事項は、キャッシュファイルはmd5ハッシュオ、キーの値をリンクする。のキャッシュされたページが格納されてい/l/45ed4aade64d427...99919cba2bd90f.html.
基本的にいているようですが、掃除ない実際に観測されます。読んだもの(こちらの)されることができるだけで追加の清掃にconfig.active_record.オブザーバー環境です。rbがされているようには思えないので(とんだのload_pathのアプリ/掃除機です。rb obviatedいします。
解決
ちょうどノート:あなたはApplicationControllerにでcache_sweeper
を使用することができます。
class ApplicationController < ActionController::Base
cache_sweeper :my_sweeper
end
class MySweeper < ActionController::Caching::Sweeper
observe MyModel
def after_update(my_model)
expire_page(...)
end
end
他のヒント
いたって数多くの異なるアプローチを見て、うっとも処理しません。
再びをとりまとめ状況: 私の目標は終了となるキャッシュされたページがオブジェクトの更新、失効しに頼らずともコントローラです。 従来のスイーパーラインのコントローラーの通知、掃除が必要であると考える。この場合、を使用することはできませんラインのコントローラとしての更新が起こっているのモデルです。通常のスイーパーチュートリアルな仕事をしていることが推定メインとの相互作用データベースオブジェクトを通じてコントローラ部でします。
場合、もしこれを読んだ方の締付けにもコードくださいコメントを、ぜひ意見を聞かせてほしい。
最初に見られるように、このような仕事に、場合にはんだことも必要です。
すべてのもっこった事を宣言するafter_updateコマンドオブザーバーのためのモデルです。このコマンドを使用した明示的なコマンドのexpire_page行動は、パスしていた宣言です。rb.
います。この作品:
Config/です。rb
map.link 'l/:md5.:format', :controller => 'links', :action => 'show'
App/モデル/link_observer.rb
def after_update(link)
ActionController::Base.expire_page(app.link_path(:md5 => link.md5))
end
なお、"md5"は、特定のマアプリです。するために使用idまたはその他の独自の識別子です。
があったことを宣言することActionController::ベ---ラインからの方法のモデルにより行なっているのに更新しました。それは、内リンクです。rbの方法が実際に更新のデータベースまでこだわった全線、うまくいった。てもいいかもしれませんね了するページのキャッシュその他の方法では、将来、こうした試みについてなどで抽出し、オブザーバー.
現在見られるように、トラクションは時代とともに動作しなかった場合、まGoogling頃ます。
呼び出し"expire_page(...)" 内after_updateリンクの方法内link_observer.rbなどに開業を予定しているのは"未定義の方法`expire_page'"エラー
作りスイーパーファイル により以下の点が確認されたモデルになります。見られませんでしたが他のエラーコードが、それだけでもないで仕事にいかない。この後、明示的に呼び出し"config.load_paths+=%W#{RAILS_ROOT}/app/スイーパー)"内環境です。rb.う脂肪手もいることを、ここでは:
class LinkSweeper < ActionController::Caching::Sweeper
observe Link
def after_update(link)
clear_links_cache(link)
end
def clear_links_cache(link)
# DID NOT WORK expire_page :controller => 'links', :action => 'show', :md5 => link.md5
# DID NOT WORK expire_page '/l/'+ link.md5 + '.html'
# DID NOT WORK ActionController::Base.expire_page(app.link_path(:md5 => link.md5))
end
end
この例ではlink_sweeper.rbのファイルのディレクトリ/app/スイーパー.もう入れlink_sweeper.rbはアプリ内/モデルのディレクトリに、呼び出しでは、config.active_record.オブザーバーのコマンドで環境です。rb
config.active_record.observers = :link_observer, :link_sweeper
が動作しなかった。
うーん。できるこれらの方法にうことになるしゃながら、何らかのコードです。思ったものです。
最終的にまとめると:るのではなく、掃除が終ページのキャッシュしたいという人もい設after_コールバックのモデルのオブザーバー.また明示的なパスが基本となります。expire_page方法
def after_update(<model>) # where <model> is the name of the model you're observing
ActionController::Base.expire_page(app.<model>_path(:id => <model>.id)) # where <model> is the name of the model you're observing
end
このまうのです。まだのどこでも私の職コードがったもののうえぜひ<url>までご連絡ください。そのままだったのできるコードの厳格化は、ぜひ<url>までご連絡くださいことです。
私は同じ問題を経験していました。観察するスイーパーを取得するので、私は上記と呼び出しApplicationController.new.expire_fragment(...)
としてそれをARオブザーバーを作るための解決策のために解決しませんでした。
私はこの作業を取得しました。私のセットアップのわずかな違いは、スイーパーは、Railsのエンジンの一部であるということです。そのわずかな違い(代わりにenvironment.rbの中でロードパスに追加のエンジンのinitに必要とスイーパーファイルを読み込むなど)を占めています。
だから、スイーパーは、このようなエンジンのinit.rbにロードされます:
require File.join(File.dirname(__FILE__), 'app', 'sweepers', cached_category_count_sweeper')
私はそれがスイーパーと呼ばれるので、「スイープ」のキャッシュが、私はモデル上のちょうど観測者を推測ます:
class CachedCategoryCountSweeper < ActiveRecord::Observer
observe CategoryFeature
def before_save(cf)
expire_cache(cf.category_id_was) if cf.category_id_changed?
end
def after_save(cf)
expire_cache(cf.category_id)
end
def after_destroy(cf)
expire_cache(cf.category_id)
end
def expire_cache(c)
ApplicationController.expire_page("/categories/#{c}/counts.xml") if !c.nil?
end
end
率直に言って、私はハードコードパスを有する好きではないが、私は追加してみました。
include ActionController:UrlWriter
と、パスの方法を使用して、それが唯一の開発に私のために働きました。それは私の本番サーバーが(代わりに、仮想ホストの)相対URLのルートと内部メソッド「page_cache_path」を使用していますので、それは有効期限が切れていないことができるように、一貫間違ったファイルパスになるだろう、生産では動作しませんでした。
これは、観察者であるので、私はenvironment.rbにに追加
config.active_record.observers = :cached_category_count_sweeper
(モデルオブザーバを介して行われ、それを期限切れにしない、)キャッシュを使用しています。最後コントローラーます:
class CachedCategoryCountsController < ApplicationController
caches_page :index
# GET /cached_category_counts.xml
def index
...
end
end
いずれにせよ、このことができます願っています。
アンドレスモンターノ
私があるのではなく、向こうで働きにより追加
ActionController::Base.expire_page(app.link_path(:md5 => @link.md5))
の方法のモデルはその更新のデータベースです。 この感じはややhackyもいるのかについてまとめたものだって説明でき作業ではない通常の掃除の設定を行いますエレガントに取扱います。
このスニペットのコード以外のものをカスタマイズルにお電話にてお申込下さい(自分のアプリ) この投稿ruby-forum.com.
私はここで、このトピックについて少し書きました: Railsのキャッシュスイーパーの混乱を。あなたの意見を聞くのが大好きだ。
@moiristoと@ZoogieZorkの回答に基づいて、私はこれが(未テスト)に働くだろう推測しています。
class LinkSweeper < ActiveRecord::Observer
include ActionController::Caching::Pages
# or if you want to expire fragments
#include ActionController::Caching::Fragments
observe Link
def after_update(link)
expire_page( ... )
#expire_fragment( ... )
end
end