テスト環境と運用環境での ETag 値が正しくありません
-
21-09-2019 - |
質問
説明されているように、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
を設定するメソッド etag
の Response
オブジェクトには次のコードが含まれます。
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_classes
がfalse
だったのでたびにモデルが再読み込みされたため、それはを開発の環境ではありませんでした!
他のヒント
ヘッダー行/パラメーターに最大値があるかどうかはわかりませんが、例がすでに示しているように、カテゴリが多いと ETag 値は非常に長くなります。
すべての作成日と変更日を含む大きな文字列を作成する代わりに、最新の変更日を見つけて ETag に使用できます。
さらに あなたが引用した記事 用途 fresh?
の代わりに stale?
他のいくつかの方法も含めて。なぜそれらを使用しないのですか?
編集: あなたの記事を見ていると、 更新されたリンク 解決策は、1つだけを記入することのようです @category
(彼らと同じです)。したがって 探す 最後に変更されたカテゴリ
@category = Category.find(:first, :order => 'date DESC')
この値を使用して ETag の MD5 を生成します。
の完全なリストを取得する @categories
ページをレンダリングしている場合のみ。