2012-05-19 18 views
6

ための複数のページを期限切れ私のアクションでexpire_actionを実行すると、最初のページの有効期限が切れます。私が知っているように、ページを指定するためにクエリ文字列を使用するとキャッシュが機能しないことがわかっているので、URLの最後にページが追加されるようにルートを設定しました(たとえば/ people/123/page/2)。Railsのキャッシング:私は</p> <p>:私は(掃除して、私はそれがここには無関係だと思う)アクションのキャッシュを設定している私のアプリでは、これまでのところ、それは一つのことを除いて素晴らしい作品1つのアクション

私は必要に応じてこのポストに情報を追加しますが、ここには何も明白ではないと思います。他のページを期限切れにする方法を知っていますか?

+0

インデックスの最初のページ以外のものを除外できれば誰も次のページを見ることはないので、同じようにうまくいくのは... – rogerkk

答えて

5

私はまだ私の元の質問に対する答えに興味があり、解決策が出たら私の受け入れられた答えを変えるでしょう。つまり、ページが全く指定されていないかどうかをチェックするだけで、元のページをキャッシュすることになりました。

キャッシュ:インデックス、:if => Proc.new {params [:page] .nil? }

+0

nice logic、bro – Mukesh

+0

そのケースの別の解決策が使用されています'cache_path'オプション.. http://stackoverflow.com/a/2166419/1297435 –

1

これは私が考えている解決策ですが、まだ実装されていませんが、同じ問題に直面しています。実際の有効期限を独自のキーでキャッシュします。キーは、検索URLの標準的な表現、つまり「ページ」パラメータなしのものです。例:

ユーザーはhttp://example.com?q=foo&page=3で検索します。したがって、パラメータは{ q: 'foo', page: 3 }です。ストリップアウト "ページ= 3"と私たちは{q: 'foo'}を残しています。

これにto_paramを実行してプレフィックスを追加すると、search_expiry_q=fooのようなキャッシュキーが残ります。

この正規のクエリのキャッシュをルックアップします。つまり、Rails.cache.read(search_expiry_q=foo)です。存在する場合、結果は現在のところ期限切れになります。残念ながらexpires_inではなく、expires_atであるため、計算を行う必要があります。つまりexpires_in: expiry_time - Time.now - 5.seconds(5秒で競合状態が回避されることを望みます)のようなものです。この方法で完全なURL/paramsをキャッシュします。

OTOH有効期限がない場合、最近誰も検索を行っていません。だから我々はやる:

expiry_time = Time.now + 1.hour 
Rails.cache.write(`search_expiry_q=foo`, expiry_time, expires_in: 1.hour) 

とフルURL /パラメータ、およびexpires_inで再び、このフラグメント/ページをキャッシュ:1.hourを。

関連する問題

 関連する問題