Правильная процедура для помощников тега в усах - PullRequest
5 голосов
/ 24 ноября 2010

Я перечитывал документацию по усам, и она выглядит круто: https://github.com/defunkt/mustache

Существует четкое разделение между кодом ruby ​​и HTML-разметкой.Не запустив проект усов, я запутался в следующем: как обрабатывать ruby, который генерирует разметку?Очевидными примерами могут быть помощники форм и link_to, не говоря уже о каких-либо пользовательских методах.Было бы правильно (или возможно) сделать {{link_to ...}}?- имея код в разметке.Или определить пользовательский метод в представлении ruby: {{what_link}}?- это кажется НЕ СУХИМ и в равной степени нежелательным.Где победа?

Спасибо!--Peter

Ответы [ 3 ]

3 голосов
/ 24 апреля 2011

Усы очень просты по дизайну. Предполагается, что шаблоны можно рендерить на многих языках (см. https://github.com/defunkt/mustache/wiki/Other-Mustache-implementations).. Многие веб-приложения выбирают усы, поскольку шаблоны могут совместно использоваться клиентским кодом (javascript) и серверным кодом (на любом языке).

Победа не идет против этого факта, даже если это может показаться неудобным на первый взгляд.

Исследуйте решение {{what_link}} и оставьте ваш код как СУХОЙ, как можете.

2 голосов
/ 01 июня 2012

Вот что я делаю в усах.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 }}

Также возможно иметь один префикс для всех статических ресурсов (например, статических), но вы не можете использовать точки, чтобы указать расширение файла, поэтому вы должны использовать некоторые другие символы для представления точек и замены в вашей обработке. код.

Вероятно, вы можете адаптировать эту технику к вашему веб-фреймворку / языку.

1 голос
/ 16 сентября 2012

Я согласен с Gwendal в том, что цель Mustache состоит в том, чтобы иметь возможность обмениваться мнениями между вашим бэкэндом и внешним интерфейсом, хотя это не единственная цель - вы можете использовать Mustache, если вы просто хотите очистить свои представления. В этом свете еще один способ думать об усах - это то, что они выдвигают логику на уровень позади непосредственного интерфейса (т. Е. Код Ruby). Так что в этом среднем слое вы можете делать все, что захотите. Я бы порекомендовал использовать гем stache , поскольку он заполняет пробел между усами и рельсами, создавая связь между вашим классом представлений усов и базовым классом представлений Rails. Таким образом, вы можете использовать, например, link_to в этом среднем слое. Вам нужно создать метод представления, который обернет вызов для link_to для определенного объекта, поскольку вы не можете вызывать методы в шаблоне усов и передавать ему аргументы, но я думаю, что это нормально.

...