2016-03-31 8 views
2

map[string]stringの値を使用する一連のテンプレートがあります。マップルックアップが失敗したときのテンプレートからの解析エラーの返信

<h1> You sent in {{.Field1}} and {{.Field2}} </h1> 

ペイロードのようなものは次のようになります。実行時に決定されている私は、テンプレートとペイロードとしてstructdataを変換することはできませんerr := tmpl.Execute(w, data); // data is map[string]string and was decoded from the payload

{"Field1": "Value1", "Field2": "Value2"}

として呼び出されます。これらのテンプレートはビジネスユーザーによって作成されたもので、新しいテンプレートがあるたびに各テンプレートのタイプを作成してバックエンドを変更する必要はありません。従って、map[string]stringを解決したいという願望がある。

上記のデザインの問題点は、テンプレートで使用されているフィールドが実行時に渡されない場合です。テンプレートを実行すると、欠落しているフィールドはテンプレート内に空の文字列を返します。私はそれが起こるとエラーを返すしたいと思います。

マップルックアップが失敗したときにテンプレートが解析エラーを返すようにする方法があるかどうかを知りたいですか?または、動的ペイロードを可能にするテンプレートに実行時エラーチェックを伴う一般的なstruct値を渡す方法はありますか?

ありがとうございます!

答えて

3

"missingkey=error"オプションを使用します。

tmpl := template.Must(template.New("").Option("missingkey=error").Parse(
     `<h1> You sent in {{.Field1}} and {{.Field2}} </h1>`)) 

playground example

+0

Tnanks @KarrotKake。 '' html/template ".New(" ")。オプションが定義されていない(タイプ*" html/template ".Templateにフィールドまたはメソッドのオプションがありません)'私は使用しています'go1.6'(appengine - 違いがあれば分かりません) – Ecognium

+1

@Ecognium Go 1.6にはテンプレート' Option'メソッドがあります。更新された回答からリンクされている例を参照してください。 –

+0

もう一度ありがとう!私はこの問題がappengineランタイム側にあるようだと思います。この作業をするには、管理対象VMに切り替えなければならないでしょう。私は 'Option'について知らなかったので、これをどう扱うべきかを示してくれてありがとう。 – Ecognium

関連する問題