如何在RoR中手动缓存页面?

时间:2010-07-01 06:52:25

标签: ruby-on-rails caching

我正在尝试在RoR中创建一个站点,并为某些页面和操作启用了缓存。每次都可能无法访问相关的DB,因此非常需要使用缓存。因此,我无法等待某人实际访问该页面,渲染它然后缓存它。相反,我希望以编程方式手动缓存任何可缓存的内容。它实际上是否可能或者是否在RoR中完全自动缓存?

4 个答案:

答案 0 :(得分:0)

懒惰*解决方案是使用lynx甚至curl作为部署过程的一部分访问页面。这将从外部触发缓存事件,但是在您选择的时候。

(*)懒惰,我希望。

答案 1 :(得分:0)

查看此page_cache plugin。看起来这就是你所需要的。

答案 2 :(得分:0)

我正在进行手动缓存触发,看起来您可以使用actionpack-page_caching插件的内置API来手动触发页面缓存的创建。您需要将cache_page(content, path, extension = nil, gzip = Zlib::BEST_COMPRESSION)函数与属性一起使用(在https://github.com/rails/actionpack-page_caching/blob/master/lib/action_controller/caching/pages.rb处查看第80行)。这里我做了一个示例动作,它迭代了一些集合,并为这个集合的每个项目制作了“show”方法的缓存。

def precompile
    @pages = Page.all
    @pages.each do |page|
      @page = page
      cache_page(render_to_string(template: 'pages/show'), url_for(action: :show, id: @page, only_path: true))
    end
    redirect_to '/'
end

我的代码的url_for(action: :show, id: @page, only_path: true)部分不是很干净,但它是我需要的第一个代码版本,欢迎任何重构。 此外,此代码将在每次触发时覆盖缓存文件,而不检查任何更改或过期。

答案 3 :(得分:-1)

参考: - Link

class ProductsController < ActionController 
  caches_page :index  
  def index

  end
end 

在环境config / environments / development.rb

中将执行缓存设置为true
config.action_controller.perform_caching = true