我不太会留胡子.

许多模板语言(例如,Django/Jinja)将允许您像这样扩展"父"模板...

基础html

<html><head></head>
    <body>
    {% block content %}{% endblock %}
    </body>
</html>

首页.html

{% extends "基础html" %}
{% block content %}<h1>Foobar!</h1>{% endblock %}

rendered 首页.html

<html><head></head>
    <body>
    <h1>Foobar!</h1>
    </body>
</html>

我知道mustache 是partials(比如{{>content}}),但看起来只有includes.

mustache 有模板扩展吗?或者,如果做不到这一点,至少有一些设计模式可以有效地将includes转化为模板扩展类似功能.

推荐答案

我最近发现自己也在同一条船上,只是我出身于mako.

Mustache不允许模板扩展/继承,但据我所知,您可以使用一些选项.

  1. 你可以使用partials:

    {{>header}}
        Hello {{name}}
    {{>footer}}
    
  2. 您可以将模板预处理函数注入需要从其他页面继承的每个模板的上下文中:

    {{#extendBase}}      
        Hello {{name}}
    {{/extendBase}} 
    

    搞砸:

    {
       "name": "Walden",
       "extendBase": function() {
           return function(text) {
               return "<html><head></head>" + render(text) + "</body></html>"
           }
       }
    }
    
  3. 在控制器中的相关页面上预先添加并附加所需的HTML.

  4. 有一个布局模板:

    {{>header}}
        {{{body}}}
    {{>footer}}
    

    并在控制器中渲染主体,将其作为名为body的变量传递给布局模板.

  5. 在加载模板的代码中实现模板继承.

然而,我不会使用三重胡须,因为我不想让未经修饰的HTML出现在任何地方,在我看来这太危险了.

如果其他人对这个问题有更好的解决方案,我也很乐意听到,因为我还没有在任何一个方向上冒险.

Ruby相关问答推荐

在 Ruby 中,如何从派生类中重写同一方法的不同方法调用基类方法?

重写 Enum#inject 以在 Ruby 中将符号作为参数

独立于 Rails 使用 HAML 文件中的布局

在 YAML 变量中包含 jekyll / liquid 模板数据?

将 2 元素数组的数组转换为哈希,其中重复键附加附加值

Ruby 模块 - 包括 do 结束块

Ruby 中的排序稳定吗?

从Electron邮件中删除签名和回复

如何绘制 git repo 的代码行历史记录?

Ruby数组限制方法

条件子句中的赋值是好的Ruby风格吗?

用 Ruby 解析 XML

在 Ruby 中计算中位数

如何在 Ruby 中遍历多行字符串?

如何按字母顺序对字符串字符进行排序?

Ruby - Array#<< 和 Array#push 之间的区别

如何传递函数而不是块

obj.nil?与 obj == nil

当我们导入 csv 数据时,如何消除UTF-8 中的无效字节序列

如何使用 Ruby 删除回车?