我们在我们的主要公司博客https://reinteractive.net 上这样做。
您可能想要做的是对要缓存的页面的显示操作进行片段缓存。这样做有一些缺陷,其中最大的缺陷是如果底层页面发生变化,缓存就会过期。
它是这样工作的:
在routes.rb 文件中:
AppName::Application.routes.draw do
get "page/:id" => "pages#show"
end
在控制器中(app/controllers/pages_controller.rb):
class PagesController < ApplicationController::Base
def show
@page = Page.find(params[:id])
end
end
请注意,在控制器中,您在每次请求时都会访问数据库,但这应该是一个非常快的请求,并且具有正确的索引。
然后在视图中(app/views/pages/show.html.erb):
<% cache("pages/show/#{@page.id}-#{@page.updated_at.to_i}") do %>
<%# Render your complex page here %>
<% end %>
像这样缓存一个片段的好处是,渲染的输出被存储在缓存中,如果这个页面需要一段时间来渲染,你可以节省大量时间,尤其是在渲染需要 100 毫秒或更长时间的情况下页面及其所有部分,您第一次付费,然后在几毫秒内加载。
注意我们正在检查页面的最后更新时间?这样一来,如果您想使此缓存过期(并再次渲染),您只需在要更新的页面对象上调用 page.touch updated_at 时间。
如果您有任何其他也可以更新的对象(例如page.header_image 或其他东西,那么您也可以将这些相关对象上的 updated_at 也放入缓存键中,或者在更新时手动使它们过期页面。
将updated_at 添加到缓存键中的另一种方法是在模型中使它们过期,如下所示:
class Page < ActiveRecord::Base
after_save :expire_cache
def expire_cache
Rails.cache.delete("CACHE_KEY")
end
end
但这有它自己的挑战。
祝你好运!