I’m writing a new theme from scratch. I have a single index.html and a single partial. This is index.html in its entirety:
 {{ $paginate := .Paginate (where .Site.Pages "Type" "post") }}
  {{ range $paginate.Pages }}
    {{ partial "detail.html" . }}
  {{ end }}
And this is the detail.html partial:
 <div class="tags">
        {{ $total := len .Params.tags }}
        {{ range $i, $tag := .Params.tags }} // this works if I remove the line above
        <a href="{{ "/tags/" | relURL }}{{ $tag |urlize}}">{{ $tag }} </a>
        {{ end }}
  </div>
I’m able to range over .Params.tags without issue, but calling len on .Params.tags throws:
 at <len .Params.tags>: error calling len: len of untyped nil
Content example:
---
title: "Test"
date: 2018-07-18:37:59-07:00
tags: ["test"]
draft: false
---
WTF
hugo env:
 Hugo Static Site Generator v0.42.2 linux/amd64 BuildDate: 2018-07-02T23:39:55+0200
 GOOS="linux"
 GOARCH="amd64"
 GOVERSION="go1.10.3"
             
            
              
              
              1 Like
            
            
           
          
            
            
              Untested wild guess: does the Param you’re testing for exist on all content? In other contexts “with” helps this.
             
            
              
              
              
            
            
           
          
            
            
              The content is only that single example post, so can confirm it’s not from missing tag frontmatter. However {{ with .Params.tags }} produces a new error:
can't evaluate field Params in type []string
I’m getting the  same issue when I try it as toml frontmatter as well:
+++
title = "Test"
date = "2018-07-18:37:59-07:00"
tags = ["test"]
draft = false
+++
For some reason it evaluates properly with range but not with or len
             
            
              
              
              
            
            
           
          
            
            
              Super odd, if I add {{ printf "%#v" .Params.tags}}
I get []string{"test"} so it’s getting populated for sure
Also in the top example I use .Site.Pages which does include a top level “Posts” obj without tags, but using .Data.Pages doesn’t, and produces the same result.
             
            
              
              
              
            
            
           
          
            
            
              Have you figured it out this problem?
             
            
              
              
              
            
            
           
          
            
            
              I know that the original question is from ages ago, but have you tried .Page.Params.tags from within the partial?
This seems like a scoping issue.
             
            
              
              
              
            
            
           
          
            
            
              I have exactly the same issue. I have this code:
{{ $pgs := .Param "componentOf" }}
{{ printf "Variable: %#v\n" $pgs }}
It generates either []string{} or []string{ "..." }, yet:
{{ $pgs := .Param "componentOf" }}
{{ printf "Variable: %#v\n" $pgs }}
{{ $pgsc := len $pgs }}
{{ printf "%+v\n" $pgsc }}
causes:
Rebuild failed:
Failed to render pages: render of "section" failed: "/Users/bsheward/site/themes/genesis/layouts/service/list.html:15:40": execute of template failed: template: service/list.html:15:40: executing "main" at <len $pgs>: error calling len: reflect: call of reflect.Value.Type on zero Value
13 {{ printf "Variable: %#v\n" $pgs }}
14
15 {{ $pgsc := len $pgs }}
16 {{ printf "%+v\n" $pgsc }}
Surely len should return 0 if it is passed an empty string array, right?
             
            
              
              
              
            
            
           
          
            
            
              I encountered the same error. In my case, the tags were not defined for some posts, so it was failing to process those (even though the single file I was testing on had tags aplenty). Testing using ‘with’ first fixed it.