2010-05-04 15 views
6

Tatili. Sorun, ilk birkaç sayfanın bir dağıtımdan sonra yüklediği, sayfada css veya js bulunmadığıdır. Önbelleğe alınan all.js ve all.css rejenere oluncaya kadar sanırım.Raylar Varlık Caching Böyle Raylar varlık JS için önbelleğe alma ve CSS kullandığınız İlk birkaç sayfa yükleri

Her gün birçok kez dağıtıyoruz ve bu, bozuk bir sayfaya rastlamak isteyen kullanıcılar için korkutucu.

Kişiler, bu önbelleği daha kolay hale getirmenin herhangi bir yolunu bulduklarından, yeni önbelleğe alınan öğeler ilk yeni sayfa yüklemesinde orada olacak şekilde garanti ediliyor mu?

+0

Bir kaç soru: 1) Farklı makinelerde birden fazla uygulama sunucunuz var mı? 2) Şablonlarda CSS için önbellek çizgisi nedir? – scottd

+0

Merhaba Scott. Tek bir makinede tüm uygulama sunucuları. İşte css önbellek satırının bir örneği: '<% = stylesheet_link_tag 'reset', 'global', 'admins', 'autocomplete', 'date_input', 'tablesorter', 'partner', 'jqmodal',: media = > 'screen',: cache => set_asset_cache (: admins)%> 'Yöneticiler, alıcılar, satıcılar, açılış sayfaları, vb. için ayrı düzenlerimiz var. Teşekkürler! –

cevap

3

AssetHat gem bu sorunu giderir. Bir sayfanın ilk yüklendiği (bu sayfanın yüklenme süresini arttıran) varlıkları birleştirmek yerine, yerine dağıtımdaki varlıkları birleştirir. Bir bonus olarak, mücevher ayrıca değerli baytları kaydeden CSS ve JS'nizi de küçültür.

kurulumdan sonra, kullanım oldukça basittir:

  • kullanın include_css :bundle => 'admins' ve mizanpajınızda include_js :bundle => 'admins'. (Paket içeriği düzeninizi hafif tutmak için bir yapılandırma dosyasında ayarlanır.)
  • Dağıtım komut dosyasına rake asset_hat:minify ekleyin. Şirketim yaklaşık bir yıldır Capistrano ile üretimde kullanıyor.

readme ve docs'da daha fazla bilgi ve herhangi bir soru/fikir duymaktan mutluluk duyarız!

1

Bir örnek (shamelessly reposted) olarak, wget kullanarak dağıtım sırasında önbelleği ısınma deneyebilirsiniz: Yeni dağıtım için sembolik geçiş sonrasında

wget -r -nd --delete-after http://whatever.com/~popular/page/ 

Ancak bu yürütülecek olurdu. Muhtemelen daha şık bir çözüm, varlığınızdaki varlık önbellekleme yöntemlerini el ile aramak olabilir, ancak bunun ne kadar uygun olduğundan emin değilim. Here's where the caching is performed in Rails:

# File vendor/rails/actionpack/lib/action_view/helpers/asset_tag_helper.rb, line  273 
273:  def javascript_include_tag(*sources) 
274:   options = sources.extract_options!.stringify_keys 
275:   concat = options.delete("concat") 
276:   cache = concat || options.delete("cache") 
277:   recursive = options.delete("recursive") 
278: 
279:   if concat || (ActionController::Base.perform_caching && cache) 
280:   joined_javascript_name = (cache == true ? "all" : cache) + ".js" 
281:   joined_javascript_path = File.join(joined_javascript_name[/^#{File::SEPARATOR}/] ? ASSETS_DIR : JAVASCRIPTS_DIR, joined_javascript_name) 
282: 
283:   unless ActionController::Base.perform_caching && File.exists?(joined_javascript_path) 
284:    write_asset_file_contents(joined_javascript_path, compute_javascript_paths(sources, recursive)) 
285:   end 
286:   javascript_src_tag(joined_javascript_name, options) 
287:   else 
288:   expand_javascript_sources(sources, recursive).collect { |source| javascript_src_tag(source, options) }.join("\n") 
289:   end 
290:  end 

Sen önbelleğe alma kodunu değiştirmek ve dağıtmak üzerinde elle çalıştırmak mümkün olabilir.

+0

Varlık önbelleklerin bazıları önbellekleme yapabilmemize rağmen, giriş yapılabilen sayfalarda (yöneticiler, alıcılar, satıcılar vb.) Sadece bir küme oluşturabilir, bu yüzden bir kullanımın basit bir wget ile oturum açabileceğini düşünmüyorum. Write_asset_file_contents yöntemi ümit verici görünüyor. Birisi bunu bir capistrano dağıtımı ile çalışıyorsa, bu ilginç olurdu. –

İlgili konular