Variables & Scopes
The underlying Go text/template system has semantics which will impact how variables are scoped and can be accessed. This page will help you understand and work through these.
Range and With statements
A range or with statement will hide any .Value
paths
because it creates a new scope.
To access variables outside, assign them to $Value
like in this example.
We often recommend that you capture your important variables at the start of a template or partial as a best practice you should adopt.
{{ $DM := .DM }}
{{ $M := .Model }}
CREATE TABLE {{ snake $M.Plural }} (
{{ range $K, $F := $M.Fields }}
{{ if ne $K "$hof" }}
{{ template "sql/create-field.sql" (dict "Field" $F "Model" $M "DM" $DM) }}
{{ end }}
{{ end }}
);
Passing variables to sub-templates (partials)
In the same way, a call to a partial template will create a new scope.
Your top-level or saved variables will not be accessible.
These partial templates only accept one value,
so to pass multiple, we use the dict
helper.
You can see this in the above example.
The partial template referenced:
{{ snake .Field.Name }} {{ if .Field.sqlType -}}
{{ .Field.sqlType }}{{ else }}{{ .Field.Type -}}{{end}}{{ with .Field.Default }} DEFAULT {{.}}{{ end }},
{{ if .Field.SQL.PrimaryKey }}constraint {{ .Model.Plural }}_pkey primary key ({{ snake .Field.Name }}),{{ end }}