不能在允许字符串文字的地方使用字符串类型的模板变量?
Can't use template variable of type string where a string literal would be allowed?
我似乎无法使用字符串类型的模板变量调用 .Resources.GetMatch
,尽管我可以使用字符串文字调用它。我知道我可以在 with
块中使用 .
调用它,但想知道为什么这段代码不起作用。
主模板调用带有第二个参数的部分 .Scratch
:
single.html
...html
<div >
<p>Feature image:</p>
{{ .Scratch.Set "arg1" .Params.image}}
{{ partial "local-image.html" . }}
<p>End feature image:</p>
</div>
部分尝试检索 scratch 参数并检索相应的页面资源对象:
{{ $srcPath := (.Scratch.Get "arg1") }}
{{ printf "debug type %T, value %#v" $srcPath $srcPath}}
{{ .Resources.GetMatch $srcPath }}
Hugo 构建错误:
ERROR 2020/11/24 00:28:34 Failed to render pages: render of "page" failed:
execute of template failed: template: _default/single.html:67:7: executing "main" at <partial "local-image.html" .>:
error calling partial: "C:\Users\xyz\src\hugo-blog\themes\hugo-theme-bootstrap4-blog\layouts\partials\local-image.html:5:23": execute of template failed:
template: partials/local-image.html:5:23: executing "partials/local-image.html" at <$srcPath>:
invalid value; expected string
如果我注释掉失败的行,这样我就可以看到前面的调试输出,
{{ $srcPath := (.Scratch.Get "arg1") }}
{{ printf "debug type %T, value %#v" $srcPath $srcPath}}
{{/* .Resources.GetMatch $srcPath */}}
构建成功,页面呈现如下:
Feature image:
debug type string, value "IMG_20200404_164934.jpg"
End feature image:
所以这里的谜题是为什么 .Resources.GetMatch
抱怨 $srcPath
而后者显然是 string
.
类型
(是的,我知道将多个参数传递给 dict
中的部分会更通俗,但我 运行 在提取部分中的值时遇到了类似的错误,所以出现了以上面更简洁的例子为例。)
我重写了有问题的代码并提出了一个可行的解决方案,但我从来没有发现上面我到底哪里出了问题(对于任何想指出我到底哪里出错的人来说,它仍然是可重现的)。
为了以可接受的答案结束此线程,我是这样做的。
或许对未来的游子有所帮助...
基本上,
- 将所有参数填充到调用部分的
dict
中。
- 在部分的顶部,保存
.
的值(例如在一个很好命名的本地 $args
或 $argv
)
- 无论您在何处需要特定参数值,都可以在
$args.xyzzy
中轻松获得
我不知道为什么昨天我没有想到这个简单有效的模式,今天我在网上看到很多类似的建议...
single.html
...html
<div >
<p>Feature image:</p>
{{ partial "local-image.html" (dict "page" . "arg1" .Params.image) }}
<p>End feature image:</p>
</div>
然后,在部分中检索或使用这些参数:
{{ $args := . }}
. . .
{{ $srcPath := $args.arg1 }}
{{ printf "debug type %T, value %#v" $srcPath $srcPath}}
{{ .Resources.GetMatch $srcPath }}
构建成功,页面呈现如下:
Feature image:
debug type string, value "IMG_20200404_164934.jpg"
"IMG_20200404_164934.jpg"
End feature image:
Q.E.D.
我似乎无法使用字符串类型的模板变量调用 .Resources.GetMatch
,尽管我可以使用字符串文字调用它。我知道我可以在 with
块中使用 .
调用它,但想知道为什么这段代码不起作用。
主模板调用带有第二个参数的部分 .Scratch
:
single.html
...html
<div >
<p>Feature image:</p>
{{ .Scratch.Set "arg1" .Params.image}}
{{ partial "local-image.html" . }}
<p>End feature image:</p>
</div>
部分尝试检索 scratch 参数并检索相应的页面资源对象:
{{ $srcPath := (.Scratch.Get "arg1") }}
{{ printf "debug type %T, value %#v" $srcPath $srcPath}}
{{ .Resources.GetMatch $srcPath }}
Hugo 构建错误:
ERROR 2020/11/24 00:28:34 Failed to render pages: render of "page" failed:
execute of template failed: template: _default/single.html:67:7: executing "main" at <partial "local-image.html" .>:
error calling partial: "C:\Users\xyz\src\hugo-blog\themes\hugo-theme-bootstrap4-blog\layouts\partials\local-image.html:5:23": execute of template failed:
template: partials/local-image.html:5:23: executing "partials/local-image.html" at <$srcPath>:
invalid value; expected string
如果我注释掉失败的行,这样我就可以看到前面的调试输出,
{{ $srcPath := (.Scratch.Get "arg1") }}
{{ printf "debug type %T, value %#v" $srcPath $srcPath}}
{{/* .Resources.GetMatch $srcPath */}}
构建成功,页面呈现如下:
Feature image:
debug type string, value "IMG_20200404_164934.jpg"
End feature image:
所以这里的谜题是为什么 .Resources.GetMatch
抱怨 $srcPath
而后者显然是 string
.
(是的,我知道将多个参数传递给 dict
中的部分会更通俗,但我 运行 在提取部分中的值时遇到了类似的错误,所以出现了以上面更简洁的例子为例。)
我重写了有问题的代码并提出了一个可行的解决方案,但我从来没有发现上面我到底哪里出了问题(对于任何想指出我到底哪里出错的人来说,它仍然是可重现的)。
为了以可接受的答案结束此线程,我是这样做的。
或许对未来的游子有所帮助...
基本上,
- 将所有参数填充到调用部分的
dict
中。 - 在部分的顶部,保存
.
的值(例如在一个很好命名的本地$args
或$argv
) - 无论您在何处需要特定参数值,都可以在
$args.xyzzy
中轻松获得
我不知道为什么昨天我没有想到这个简单有效的模式,今天我在网上看到很多类似的建议...
single.html
...html
<div >
<p>Feature image:</p>
{{ partial "local-image.html" (dict "page" . "arg1" .Params.image) }}
<p>End feature image:</p>
</div>
然后,在部分中检索或使用这些参数:
{{ $args := . }}
. . .
{{ $srcPath := $args.arg1 }}
{{ printf "debug type %T, value %#v" $srcPath $srcPath}}
{{ .Resources.GetMatch $srcPath }}
构建成功,页面呈现如下:
Feature image:
debug type string, value "IMG_20200404_164934.jpg"
"IMG_20200404_164934.jpg"
End feature image:
Q.E.D.