5

私は口ひげのドキュメントを読んでいますが、それはクールに見えます: https://github.com/defunkt/mustache

ruby コードと html マークアップの間には明確な分離があります。口ひげプロジェクトを開始していないので、混乱しています: マークアップを生成するルビはどのように処理すればよいですか? カスタム メソッドは言うまでもなく、フォーム ヘルパーと link_to が明らかな例です。{{link_to ...}} を行うのは適切 (または可能) でしょうか? -- マークアップにコードを含める。または、ビュー ルビーでカスタム メソッドを定義するには: {{whatever_link}}? -- これは非 DRY であり、同様に望ましくないようです。勝機はどこ?

ありがとう!
--ピーター

4

3 に答える 3

3

口ひげは非常にシンプルなデザインです。テンプレートは多くの言語でレンダリング可能であると想定されています ( https://github.com/defunkt/mustache/wiki/Other-Mustache-implementationsを参照)。クライアント コード (javascript) とサーバー コード (どの言語でも) でテンプレートを共有できるため、多くの Web アプリケーションが mustache を選択しました。

一見不便に見えるかもしれませんが、その事実に逆らわないことが勝利です。

{{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)に単一のプレフィックスを付けることもできますが、ドットを使用してファイル拡張子を指定することはできないため、ドットを表し、処理コードで置き換えるには、他の文字を使用する必要があります。

あなたはおそらくこのテクニックをあなたのウェブフレームワーク/言語に適応させることができます。

于 2012-06-01T16:16:45.690 に答える
1

Mustache の目標はバックエンドとフロントエンドの間でビューを共有できるようにすることであるという Gwendal の意見に同意しますが、それが唯一の目標ではありません。その観点から、Mustache について考えるもう 1 つの方法は、ロジックを直接のフロントエンド (つまり、Ruby コード) の背後にあるレイヤーにプッシュすることです。したがって、この中間層では、やりたいことが何でもできます。stache gemを使用することをお勧めします。これは、Mustache ビュー クラスと基礎となる Rails ビュー クラスを接続することで、Mustache-land と Rails-land の間のギャップを埋めるためです。このように、たとえば、link_toこの中間層で使用できます。への呼び出しをラップするビュー メソッドを作成する必要があります。link_toMustache テンプレートでメソッドを呼び出して引数を渡すことはできないため、特定のオブジェクトに対しては問題ありませんが、それで問題ないと思います。

于 2012-09-16T19:53:05.737 に答える