2011-07-26 18 views
6

Bir sayfa önbelleği, gerçek sayfayı bir http isteği ile çağırmadan önceden oluşturmanın bir yolu var mı?Raylar için ön izleme görünümü önbelleği

this ve this gibi çözümlere baktım, ancak bunlar önbellek oluşturmuyor.

Göreceli olarak karmaşık bir görünümüm var ve tüm şeyi önbelleğe almak istiyorum. Bu önbelleğe alınmış sürümü uygulamada önceden oluşturmak istiyorum, böylece bir kullanıcı gerçekten vurduğunda, zaten orada olacak.

Teşekkür

cevap

0

aşağıdaki linki iyi bir başlangıç ​​vermeli. How do I get the rendered output of a controller's action without visiting the web page?

Aynı şeyi gerçekleştirmeye çalışıyorum ve görebildiğim kadarıyla, sahte isteğiniz doğru ana makineye sahip olmalıdır, çünkü önbellek ana bilgisayar bilgilerini içerir.

Ben ActionController :: Entegrasyonu kullanarak önbelleğe alma başarılı :: Oturum

ais = ActionController::Integration::Session.new 
ais.host = host 
ais.xml_http_request(:post, url, params, headers) 

I'v bir tane daha var:

Bu aynı zamanda yanıt nesnesi döndürür.

+0

Teşekkürler @metaphalon .. bunu deneyecek ve rapor edecektir. – bgajdero

+0

Bu işe yaramadı ya da en azından görünümü oluşturmak için alamıyorum. ais.response, üretilen kodu döndürdü, ancak kısmi olarak değil, kısmi olarak. HAML ile yanıtı konsoldan oluşturmanın herhangi bir yolu var mı? – bgajdero

+0

Bu sadece önbelleği oluşturdu, ne tür önbellek kullandığınızı bilmiyorum. FileStore Backend'i kullanmanız gerekecektir, çünkü MemoryStore Bellekte yaşayacaktır ve tırmık (veya konsol) kapattığınızda tüm önbelleğe alınan kısmi parçalar kaybolur. – metaphalon

2

Bir komisyon görevinden benzer bir şey yapmaya ihtiyacımız vardı - biraz bağlamsal olan ve bir dizi diziden dolayı çok uzun bir varlık listesi (~ 700) göstermesi gereken kısmi bir kısma sahibiz. veritabanı yapısı sorunları ve özel sıralama ölçütleri, önbelleğe girmeden önce ilk kez 25 saniyeyi alacaktı> Bu, genellikle HTTP sunucularımızın 30 saniyeden sonra yanıtsız HTTP isteklerini sonlandırması ve önbelleğe alması nedeniyle zaman aşımına uğrayacaktı Bu özel liste bir çözümdü.

Yapmanız gereken, ActiveController :: Base'in bir örneğini veya yardımcı yöntemlere veya diğer varlıklara gereksinim duyarsanız, denetleyicilerinizden birini oluşturmaktır, sonra onun lookup_context başvurusunu yeni bir ActionView.Renderer örneğine iletir. Bizim tırmık görevi

, biz bu Rails 3.2.13 çalışır aşağıdaki

namespace :rake_for_time_consuming_nonsense do 
    task :pre_cache_long_list do 
    PreCacher.pre_fetch_partials 
    end 
end 

class PreCacher 
    def self.pre_fetch_partials 
    the_controller = ActionController::Base.new 
    # Set any instance variables required by your partial in the controller, 
    # they will be passed to the partial with the view_context reference 
    the_controller.instance_variable_set "@cache_key", cache_key 
    the_controller.instance_variable_set "@the_object", MyModel.first 

    view_renderer = ActionView::Renderer.new the_controller.lookup_context 
    view_renderer.render the_controller.view_context, {partial: 'my_model/the_partial', layout: false} 
    end 
end 

yaptı.

+0

Bu harika çalışıyor, ancak özel yardımcıları kullanamıyorum. Bunları nasıl ekleyebilirim? – Railsana

İlgili konular