質問

説明されているように、Rails の新しいキャッシュ ソリューションを使用しています ここ.

発達 環境は正常に動作しますが、 テスト そして 生産 無効な送信 ETag ヘッダーは、 stale? 関数。

私のコントローラーの対応する部分は次のとおりです。

def index
  @categories = Category.all

  if stale?(:etag => @categories)
    respond_to do |format|
      format.html
      format.xml  { render :xml => @categories }
      format.json { render :json => @categories }
    end
  end
end

stale? の方法 ActionController::Base を呼び出します fresh_when を設定するメソッド etagResponse オブジェクトには次のコードが含まれます。

def etag=(etag)
  if etag.blank?
    headers.delete('ETag')
  else
    headers['ETag'] = %("#{Digest::MD5.hexdigest(ActiveSupport::Cache.expand_cache_key(etag))}")
  end
end

Category モデルは正しいものを送信します cache_key すべての環境でそれが発生した場合:

>> Category.find(1).cache_key
=> "categories/1-20100117153353"
>> ActiveSupport::Cache.expand_cache_key(Category.find(:all))
=> "categories/1-20100117153353/categories/2-20100117152007/categories/3-20100116094423/categories/4-20100116094423/categories/5-20100116094423/categories/6-20100116094423/categories/7-20100116094423/categories/8-20100117145800/categories/9-20100117145808"

URLを選択すると、何が起こっているのかわかりません。 http://localhost:3000/admin/categories/ とともに 発達 環境、 ETag 節約するたびに変わります Category しかし、 テスト または 生産 そうではありません。

私はそれをテストしました ウェブリック そして 薄い

役に立ちましたか?

解決

ソリューションは、すべてがリクエストの残りのためにキャッシュされたフェッチされたので、一度Category.allメソッドは、クラスレベルで結果をキャッシュされたということでした。

その環境でconfig.cache_classesfalseだったのでたびにモデルが再読み込みされたため、それはを開発の環境ではありませんでした!

他のヒント

ヘッダー行/パラメーターに最大値があるかどうかはわかりませんが、例がすでに示しているように、カテゴリが多いと ETag 値は非常に長くなります。

すべての作成日と変更日を含む大きな文字列を作成する代わりに、最新の変更日を見つけて ETag に使用できます。

さらに あなたが引用した記事 用途 fresh? の代わりに stale? 他のいくつかの方法も含めて。なぜそれらを使用しないのですか?

編集: あなたの記事を見ていると、 更新されたリンク 解決策は、1つだけを記入することのようです @category (彼らと同じです)。したがって 探す 最後に変更されたカテゴリ

@category = Category.find(:first, :order => 'date DESC')

この値を使用して ETag の MD5 を生成します。
の完全なリストを取得する @categories ページをレンダリングしている場合のみ。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top