Hugo variabelescope in {{ with }} binnen {{ range }}

Definitie

In Hugo Go-templates verliest $ zijn verwijzing naar de buitenste iteratie-context zodra je een {{ with }} block betreedt. Dit veroorzaakt een buildfout of lege output bij nested context-switches.

Context

Treedt op bij Hugo-templates die itereren over een slice van dicts (bijv. via slice (dict ...)) en daarbinnen conditionele {{ with }} blocks gebruiken om paginaobjecten te resolven. Typisch patroon op de homepagina of lijstpagina’s.

Kernpunten

Foutsituatie

{{ range $disciplines }}
  {{ with .page }}
    <img alt="{{ $.name }}">  {{/* ERROR: $.name bestaat niet */}}
  {{ end }}
{{ end }}

Binnen {{ with .page }} wordt $ het Hugo-paginaobject (het resultaat van .page), niet het dict. $.name bestaat dan niet op dat paginaobject, wat een buildfout geeft: can't evaluate field name in type *hugolib.pageState.

Oplossing: variabele vastleggen vóór de {{ with }}

{{ range $disciplines }}
  {{ $disc := . }}           {{/* dict vastleggen in eigen variabele */}}
  {{ with .page }}
    <img alt="{{ $disc.name }}">  {{/* werkt altijd */}}
  {{ end }}
{{ end }}

$disc is een gewone template-variabele die niet overschreven wordt door de contextswitch in {{ with }}. Dit is het standaard Go-template-patroon voor scope-behoud.

Aanverwant: naamconflicten met Hugo-shortcodes

Hugo-shortcodes genereren HTML met klassen die dezelfde naam kunnen hebben als custom CSS-klassen. Voorbeeld: de shortcode pullquote genereert <blockquote class="pullquote"> met eigen stijlen. Een homepagina-blok met dezelfde klasse erft die stijlen onbedoeld. Oplossing: gebruik een unieke prefix voor paginaspecifieke blokken (bijv. .home-pq i.p.v. .pullquote).

Hugo-buildfouten debuggen

Hugo rapporteert de template-bestandsnaam en regelnummer bij scope-fouten. can't evaluate field X in type *hugolib.pageState betekent altijd dat $ of . naar een Hugo-page wijst, niet naar het verwachte dict of slice-element.

Verbanden

Bronnen

Geen externe publicaties; kennis uit implementatie en debugsessie door claude-sonnet-4-6.

Sessie-herkomst