2012-03-16 7 views
1

特定のモデルを処理して後処理を行うResqueキューがあります。このモデルが更新されたら、キャッシュされたビューアクションを期限切れにしたいと思います。Rails - Resqueからキャッシュされたアクションを期限切れにする(遅延ジョブの代替)

私はSweeperのセットアップと動作はしていますが、Controller Actionsでモデルに加えられた変更だけを観察します。

私のモデルからキャッシュされたアイテムが期限切れになることはあまりMVCではないことがわかりますが、すべての後処理ロジックは私のモデルに含まれています。

理想的には、私のキャッシュ・バスト・コードを二重にしたくないので、既存のスイーパにモデル・チェンジを見せることができれば理想的です。

代わりに、私のモデルまたはモデルオブザーバの内部からアクションキャッシュを消去することで解決します。

p .:私はセットアップしたモデルオブザーバ内からキャッシュされたフラグメントを期限切れにできますが、アクションはできません。

私は本当にベストプラクティスが何であるか知りたいです。私はこの欲望を持つ唯一の人ではないと確信しています。

ありがとうございました。

このような何かを移動するための方法である場合、私は思ったんだけど:

http://dev.mensfeld.pl/2011/07/rails-wykorzystywanie-sweeperow-poza-kontrolerami-na-samych-modelach/

答えて

1

私はあなたにリンクしているサイト上の私のコメントを追加することができませんでしたので。

Rails 3.1.3では、コントローラをインスタンス化してからexpire_fragmentを呼び出すと、NilClassでホストを呼び出そうとするとエラーが発生します。

いくつかの実験の後、機能テストでコントローラをインスタンス化できることを思い出しました。でもレールコンソールを使用して、でも生産で、

@controller ||= ApplicationController.new 

if @controller.request.nil? 
     @controller.request = ActionDispatch::TestRequest.new 
end 

これが動作しているようです。だから私は、インスタンス化にコードを変更しました。最後に

0

私は、次の解決策を考え出した:

はapplication.rb内のオブジェクトのオブザーバのリストに私の既存の掃除を追加しました:

config.active_record.observers = :app_sweeper 

追加コードをスイーパーメソッドにインスタンス化しますコントローラの代わりにオブジェクトを経由するときに起こることです。

@controller ||= ActionController::Base.new 

次に、expire_fragmentメソッドを使用して、次のtidbitでキャッシュされたアクションを期限切れにすることができます。

それは私が代わりに期限切れの断片とそれを偽造のexpire_actionメソッドを使用することができることを意味している場合mj1531の答えは、よりよい解決策であることを証明するかもしれない、と述べた
expire_fragment("#{ActionMailer::Base.default_url_options[:host]}/items/#{item.id}") 

。私はそれをテストし、最良の答えを選択したときに私は報告します。

関連する問題