2012-04-17 2 views
28

FuncsFuncMapを使用しようとすると、Goテンプレートで奇妙なことに気付きました。期待通りに次のコードは動作します:Goテンプレート機能

buffer := bytes.NewBufferString("") 

funcMap := template.FuncMap{ 
    "label": strings.Title, 
} 

t, _ := template.New("alex").Funcs(funcMap).Parse("{{label \"alex\"}}") 

t.Execute(buffer, "") 

return string(buffer.Bytes()) //=> "Alex" 

しかし、私は、ファイルにテンプレートを置くしようとすると、それは動作しません(Execute()は言う:"alex" is an incomplete or empty template):

t, _ := template.New("alex").Funcs(funcMap).ParseFiles("template.html") 

template.htmlで:

{{label \"alex\"}} 

理由は何ですか?これはバグですか?テンプレートでメソッド/関数を使用する簡単な方法はありますか?

+0

まずアイデアを解析からのエラーをチェックし、実行することです。上のコードでは両方を無視します。 – Sonia

+0

ええ、私はParseをチェックしましたが、Executeはチェックしていませんでした。 Executeは言う: "" alex "は不完全な、または空のテンプレート" – Blacksad

答えて

31

ParseFilesはおそらくより良い文書を使用できます。テンプレートオブジェクトには複数のテンプレートがあり、それぞれに名前があります。 ParseFilesの実装を見ると、のファイル名がテンプレートオブジェクトのテンプレート名として使用されています。だから、あなたのファイルにテンプレートオブジェクトと同じ名前をつけてください(恐らく一般的には実用的でないかもしれません)。そうでなければ、単にExecuteの代わりにExecuteTemplateを使います。

+1

あなたは素晴らしいです、それは動作します!非常に良いキャッチ。そして、これを使わなければ.Funcs()を呼び出せないので、私は.New(名前)を使うことを余儀なくされました... – Blacksad

15

ソニアの答えは技術的には正解ですが、私はさらに混乱してしまいました。ここで私は最終的にそれが働いてしまった方法は次のとおりです。

t, err := template.New("_base.html").Funcs(funcs).ParseFiles("../view/_base.html", "../view/home.html") 
if err != nil { 
    fmt.Fprint(w, "Error:", err) 
    fmt.Println("Error:", err) 
    return 
} 
err = t.Execute(w, data) 
if err != nil { 
    fmt.Fprint(w, "Error:", err) 
    fmt.Println("Error:", err) 
} 

テンプレートの名前は、テンプレートの裸のファイル名ではなく、完全なパスです。 Executeは、一致するように命名されている場合はデフォルトテンプレートを実行しますので、ExecuteTemplateを使用する必要はありません。 home.htmlは、特定の部分を定義しながら

<!DOCTYPE html> 
<html><body> 
<h1>{{ template "title" }}</h1> 
{{ template "content" }} 
</body></html> 

:この場合

_base.htmlファイルは最も外側の容器、例えばある

{{ define "title" }}Home{{ end }} 

{{ define "content" }} 
Stuff 
{{ end }} 
関連する問題