2010-11-24 11 views
5

Ich habe über den Schnurrbart Dokumentation zu lesen, und es sieht cool: https://github.com/defunkt/mustacherichtige Verfahren für Tag Helfer in Schnurrbart

Es gibt eine klare Trennung zwischen Ruby-Code und HTML-Markup. Da ich noch kein Schnurrbartprojekt gestartet habe, ist meine Verwirrung folgende: Wie sollte Ruby, der Markup erzeugt, gehandhabt werden? Offensichtliche Beispiele wären Formularhelfer und link_to, ganz zu schweigen von benutzerdefinierten Methoden. Wäre es richtig (oder möglich), {{link_to ...}} zu machen? - Code im Markup enthalten. Oder um eine benutzerdefinierte Methode in der Ansicht ruby ​​zu definieren: {{whatever_link}}? - Dies scheint nicht trocken und ebenso unerwünscht. Wo ist der Gewinn?

Danke!
--Peter

Antwort

3

Schnurrbart ist sehr einfach durch Design. Vorlagen sollen in vielen Sprachen renderbar sein (siehe https://github.com/defunkt/mustache/wiki/Other-Mustache-implementations). Viele Webanwendungen wählen einen Schnurrbart, da Vorlagen von Clientcode (JavaScript) und Servercode (unabhängig von der Sprache) gemeinsam genutzt werden können.

Der Gewinn ist nicht gegen diese Tatsache, auch wenn es auf den ersten Blick unbequem aussehen mag.

Untersuchen Sie die {{whaty_link}} Lösung, und behalten Sie Ihren Code als DRY, wie Sie können. Hier

+0

+1 Genau das. Schnurrbart zwingt Sie, alles zu behalten, was Sie in der Ansicht "falsch machen" könnten. Dies macht es viel einfacher zu testen, und, wie Gwendal sagte, ermöglicht es Ihnen, Ihre Vorlagen in jeder Sprache zu rendern (z. B. das Rendering auf clientseitiges JavaScript für Browser, die es unterstützen). –

2

ist, was ich in mustache.java tun:

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 
} 

Beim Rendern ich dies tun:

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

Sie können wie folgt verwenden (unter der Annahme Ihrer App bei/app gehostet wird):

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

Es ist auch möglich, einen einzelnen Präfix für alle statischen Ressourcen zu haben (zB: statisch), aber Sie können keine Punkte verwenden, um spe cify die Dateierweiterung, also müssen Sie ein anderes Zeichen verwenden, um Punkte darzustellen und in Ihrem Bearbeitungscode zu ersetzen.

Sie können diese Technik wahrscheinlich an Ihr Web-Framework/Ihre Sprache anpassen.

+0

das ist ein sehr netter Trick, um paramts zu mustache.java hinzuzufügen - ich war auf der Suche nach wie Parameter an Helfer übergeben –

1

Ich stimme mit Gwendal überein, dass es ein Ziel von Moustache ist, Ansichten zwischen Ihrem Backend und Frontend zu teilen, obwohl das nicht das einzige Ziel ist - Sie könnten Moustache verwenden, wenn Sie nur Dinge in Ihren Ansichten bereinigen möchten . In diesem Licht ist eine andere Art, über Moustache nachzudenken, dass sie die Logik auf die Ebene hinter dem unmittelbaren Frontend (d. H. Ruby-Code) verschiebt. In dieser mittleren Ebene können Sie also alles tun, was Sie wollen. Ich würde empfehlen, den Edelstein stache zu verwenden, da er die Lücke zwischen Moustache-land und Rails-land füllt, indem er eine Verbindung zwischen Ihrer Moustache-Sichtklasse und der zugrunde liegenden Sichtklasse Rails herstellt. Auf diese Weise könnten Sie zum Beispiel link_to in dieser mittleren Ebene verwenden. Sie müssten eine Ansichtsmethode erstellen, die einen Aufruf an link_to für ein bestimmtes Objekt umwandelt, da Sie keine Methoden in einer Moustache-Vorlage aufrufen und Argumente übergeben können, aber ich denke, das ist in Ordnung.