如何在 ruby 中缓存 Haml 模板

How can I cache Haml templates inside ruby

我正在使用 ruby 编写一个简单的 Web 框架。我正在使用

渲染我的模板
renderer = Haml::Engine.new(template_path, ...)
html_output = renderer.render(Object.new, params)

但这只给我最后渲染的 html 输出。假设我有这样的视图

-if title.include? 'Admin Page'
  =title
-else
  %a
    Test

在每个请求中它是模板的 re-render html 部分。有什么方法可以获取此模板的可缓存版本以用于生产以摆脱 re-render。缓存纯 html 在这里是不够的,因为标题可能会在请求中改变。

首先我认为这是不可能的,因为结果文件必须是 ruby 文件并且看起来像这样。

output = ''
if title.include? 'Admin Page'
  output << title
else
  output << '<a>Test</a>'
end

但在搜索之后我了解到可以缓存 Haml 文件,但我不知道如何实现这一点。我可以缓存 Haml 模板吗?如果可以,我该怎么做?我的方法在这个概念上是正确的还是我遗漏了什么?

after a search I read that Haml files can be cached but I can't figure out how to achieve this

我不知道你读的是什么,但我不认为它意味着你认为的意思。

  • 您可以读取(和缓存).haml 模板代码。
  • 您可以使用 Haml 引擎解析模板代码,以便它可以呈现,并缓存该结果,以便您可以 运行 在一组新变量上重复使用模板并获得不同的输出。
  • 而且,正如您所建议的,您可以缓存一组特定变量的 HTML 结果,这样您就不需要 运行 如果您已经看到正确的模板结果。

但是你不能按照你的建议去做——让 Haml 缓存结果 HTML 输出的一部分,同时改变其他部分——除非你将多个模板与它们自己的缓存系统链接在一起。

我用 Tilt 的缓存机制解决了这个问题。

require 'tilt'
cache = Tilt::Cache.new
cache.fetch(path_of_your_file, Tilt.new(path_of_your_file,options))

此代码将缓存 Tilt 对象,其中包含 haml 文件的已解析版本。在我的代码缓存中,key是文件的路径,你随便给。

例如,在开发模式下,我正在使用 [path_of_file, mtime_of_file],因此每当我修改 haml 文件时,都会为该文件更新缓存。