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
- Zie ook: wiki-weboke-ftp-deploy
- Gerelateerd project: jimvandenbreemen.nl
Bronnen
Geen externe publicaties; kennis uit implementatie en debugsessie door claude-sonnet-4-6.