【问题标题】:How can I cache Haml templates inside ruby如何在 ruby​​ 中缓存 Haml 模板
【发布时间】:2015-03-15 14:08:39
【问题描述】:

我正在用 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

在每个请求中,它都会重新渲染模板的 html 部分。有没有办法让这个模板的可缓存版本用于生产以摆脱重新渲染。在这里缓存纯 html 是不够的,因为标题可能会在请求中发生变化。

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

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

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

【问题讨论】:

  • 请详细说明您的问题。提供一个示例 Haml 模板,以及使用它的两三个调用,以及您希望缓存哪些部分,哪些部分必须重新计算。

标签: ruby templates caching haml


【解决方案1】:

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

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

此代码将缓存 Tilt 对象,其中包括您的 haml 文件的解析版本。在我的代码缓存键是文件的路径,你可以给它任何你想要的。

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

【讨论】:

    【解决方案2】:

    经过搜索,我读到 Haml 文件可以被缓存,但我不知道如何实现这一点

    我不知道你读到了什么,但我不认为这意味着你认为它意味着什么。

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

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

    【讨论】:

      猜你喜欢
      • 2021-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      相关资源
      最近更新 更多