1

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

開発環境は正常に動作しますが、テスト本番は無効なETagヘッダーが送信され、stale?関数のパラメーターが無視されます。

これが私のコントローラーの1つの対応する部分です:

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_whenetagResponse

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/いるのかわかりませETagCategory

webrickthinでテストしました

4

2 に答える 2

2

解決策は、Category.allメソッドが結果をクラス レベルでキャッシュすることでした。したがって、メソッドがフェッチされると、残りのリクエストのためにすべてがキャッシュされました。

モデルがリロードされるたびに開発環境にはありませんでした。その環境でconfig.cache_classesfalse!

于 2010-01-18T16:05:41.510 に答える
0

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

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

さらに、引用した記事では、他の方法を含めるfresh?代わりに使用しています。stale?なぜそれらを使用しないのですか?

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

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

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

于 2010-01-17T17:30:52.797 に答える