5

我一直在阅读 mustache 文档,它看起来很酷: https ://github.com/defunkt/mustache

ruby 代码和 html 标记之间有明显的区别。还没有开始一个小胡子项目,我的困惑是:应该如何处理生成标记的 ruby​​?明显的例子是表单助手和link_to,更不用说任何自定义方法了。做 {{link_to ...}} 是否合适(或可能)?-- 在标记中有代码。或者在视图 ruby​​ 中定义自定义方法:{{whatever_link}}?- 这似乎是非干燥的,同样不可取。赢在哪里?

谢谢!
——彼得

4

3 回答 3

3

小胡子的设计非常简单。模板应该可以用多种语言呈现(参见https://github.com/defunkt/mustache/wiki/Other-Mustache-implementations)。许多 Web 应用程序选择 mustache,因为模板可以由客户端代码 (javascript) 和服务器代码(无论哪种语言)共享。

胜利不是违背这一事实,即使乍一看可能看起来不方便。

调查 {{whatever_link}} 解决方案,并尽可能保持代码DRY。

于 2011-04-24T06:47:34.790 回答
2

这是我在 mustache.java 中所做的:

import java.util.Collection;
import java.util.Map;
import java.util.Set;

public class UrlHelper implements Map<String, String> {

    public static final UrlHelper instance = new UrlHelper();
    private static final String NORMAL_PREFIX = "url";
    private final String virtualHost;

    // configure virtualhost here
    private UrlHelper() {           
        virtualHost = "/";
    }

    public boolean containsKey(Object key) {
        return key.toString().indexOf(':') != -1;
    }

    public String get(Object key) {
        String k = key.toString();
        String prefix = k.substring(0, k.indexOf(':'));
        String url = k.substring(k.indexOf(":") + 1);
        if (prefix.equals(NORMAL_PREFIX))
            return virtualHost + url;
        return virtualHost + "static/" + prefix + "/" + url + "." + prefix;
    }
    // Default implementation for the other 'Map' methods
}

渲染时我这样做:

mustache.execute(writer,new Object[] { model, UrlHelper.instance }).flush();

您可以这样使用(假设您的应用程序托管在 /app 上):

{{js:lib/jquery}} {{! /app/static/js/lib/jquery.js }}
{{css:site}} {{! /app/static/css/site.css }}  
{{url:users/edit/1}} {{! /app/users/edit/1 }}

也可以为所有静态资源使用一个前缀(例如:static),但是您不能使用点来指定文件扩展名,因此您必须使用其他字符来表示点并在处理代码中替换。

您可能可以将此技术应用于您的 Web 框架/语言。

于 2012-06-01T16:16:45.690 回答
1

我同意 Gwendal 的观点,Mustache 的目标是能够在您的后端和前端之间共享视图,尽管这不是唯一的目标——如果您只想清理视图中的内容,您可以使用 Mustache。从这个角度来看,考虑 Mustache 的另一种方式是将逻辑推送到直接前端后面的层(即 Ruby 代码)。所以在这个中间层你可以做任何你想做的事情。我建议使用stache gem,因为它通过在 Mustache 视图类和底层 Rails 视图类之间建立连接来填补 Mustache-land 和 Rails-land 之间的空白。所以这样,你可以使用,例如,link_to在这个中间层。您必须创建一个包装调用的视图方法link_to对于特定对象,因为您不能调用 Mustache 模板中的方法并传递参数,但我认为这没关系。

于 2012-09-16T19:53:05.737 回答