سؤال

أنا أستخدم حل التخزين المؤقت الجديد للقضبان كما هو موضح هنا.

ال تطوير البيئة تعمل بشكل جيد ، ولكن اختبار و إنتاج يرسل غير صالح 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 ولكن مع اختبار أو إنتاج لم يحدث ذلك.

لقد اختبرته مع Webrick و نحيف

هل كانت مفيدة؟

المحلول

كان الحل أن Category.all قامت الطريقة بالتخلي عن النتائج على مستوى الفصل ، لذلك بمجرد أن يتم جلب كل شيء تم تخزينه مؤقتًا لبقية الطلبات.

لم يكن هناك في تطوير البيئة لأنه في كل مرة يتم إعادة تحميل النموذج لأنه في تلك البيئة config.cache_classes كان false!

نصائح أخرى

لا أعرف ما إذا كان هناك الحد الأقصى على خطوط/معلمات الرأس ، ولكن مع الكثير من الفئات ، تصبح قيمة ETAG طويلة جدًا ، كما يظهر مثالك بالفعل.

بدلاً من إنشاء سلسلة كبيرة تحتوي على جميع تواريخ الإنشاء/المعدلة ، يمكنك العثور على أحدث تاريخ تعديل واستخدام ذلك لـ ETAG.

بالإضافة إلى المقالة التي نقلت عنها الاستخدامات fresh? بدلاً من stale? بما في ذلك بعض الطرق الأخرى. لماذا لا تستخدم هؤلاء؟

تعديل: عند النظر إلى المقالة في الخاص بك رابط محدث يبدو أن الحل هو ، لملء واحد فقط @category (كما يفعلون). لذلك تجد الفئة الأخيرة المعدلة

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

واستخدم هذه القيمة لإنشاء MD5 لـ ETAG.
احصل على القائمة الكاملة لـ @categories فقط إذا كنت تقوم بتقديم الصفحة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top