我一直在阅读胡子文档,它看起来很酷: https://github.com/defunkt/mustache
ruby代码和html标记之间有明显的区别。没有开始胡子项目,我的困惑是:如何处理生成标记的ruby?明显的例子是表单助手和link_to,更不用说任何自定义方法了。 {{link_to ...}}是否合适(或可能)? - 在标记中包含代码。或者在视图ruby中定义自定义方法:{{whatever_link}}? - 这似乎不干,同样不受欢迎。胜利在哪里?
谢谢!
--Peter
答案 0 :(得分:3)
Mustache设计非常简单。模板应该可以用多种语言呈现(参见https://github.com/defunkt/mustache/wiki/Other-Mustache-implementations)。许多Web应用程序选择了小胡子,因为模板可以由客户端代码(javascript)和服务器代码(无论何种语言)共享。
胜利不是违背这一事实,即使乍一看看起来不方便。
调查{{whatever_link}}解决方案,并将您的代码保留为DRY。
答案 1 :(得分: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框架/语言。
答案 2 :(得分:1)
我同意Gwendal的说法,Mustache的目标是能够在你的后端和前端之间分享视图,尽管这不是唯一的目标 - 如果你只想清理视图中的内容,你可以使用Mustache。从这个角度来看,另一种思考Mustache的方法是将逻辑推送到直接前端(即Ruby代码)后面的层。所以在这个中间层你可以做任何你想做的事情。我建议使用stache gem,因为它通过在Mustache视图类和底层的Rails视图类之间建立连接来填补Mustache-land和Rails-land之间的空白。所以这样,你可以在这个中间层使用link_to
。您必须创建一个视图方法,该方法包含对link_to
的特定对象的调用,因为您无法在Mustache模板中调用方法并传递参数,但我认为这没关系。