2011-07-26 71 views
6

有没有办法预先建立一个页面缓存不通过HTTP请求调用实际的页面?视图缓存

我看着像thisthis解决方案,但这些不生成缓存。

我有一个相对复杂的看法,并希望缓存所有的东西。我想在应用程序中预先构建这个缓存​​版本,所以当用户真正击中它时,它已经存在。

谢谢

回答

0

我觉得下面的链接应该给你一个好的开始。 How do I get the rendered output of a controller's action without visiting the web page?

我尝试完成相同的操作,而且据我所知,您的假请求应该有正确的主机,因为缓存键包含主机信息。

我用的ActionController ::整合完成缓存::会议

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

心中已经得到了另一个问题:

这也将返回响应对象。

+0

谢谢@metaphalon ..会试试这个报告。 – bgajdero

+0

这没有奏效,或者至少我不能让它产生视图。 ais.response确实返回了生成的代码,但是返回了部分,而不是缓存。任何方式来从控制台呈现HAML响应? – bgajdero

+0

这只产生了缓存,我不知道你使用了什么缓存后端。 您将不得不使用FileStore Backend,因为MemoryStore将存储在内存中,并且当您关闭rake(或控制台)时,所有缓存的部分都将丢失。 – metaphalon

2

我们有必要做从rake任务类似的东西 - 我们有一个局部的,将需要显示一个很长的实体名单(700〜),这是有些方面的具体和,由于一系列的数据库结构问题和自定义排序标准,在进入缓存之前很容易花费大于25秒的时间进行第一次渲染>这通常会超时,因为我们的HTTP服务器设置为在30秒后终止HTTP请求而没有响应,并且预缓存这个自定义列表是个解决方案。

您需要做的是创建一个ActiveController :: Base实例,或者如果您需要帮助器方法或其他实体的控制器之一,然后将其lookup_context引用传递给一个新的ActionView.Renderer实例。

在我们的rake任务,我们做了以下

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 

这个工作在Rails的3.2.13。

+0

这很好,但我不能使用自定义助手。我怎么能包括他们? – Railsana