如何在 Jekyll 中迭代和检索 YAML _data?
How to iterate and retrieve from YAML _data in Jekyll?
我正在尝试建立一个 Jekyll 博客。但我以前从未使用过 YAML,我对这件事的逻辑感到很生气。
首先,我在 _data/authors.yml
中编写了一个 YAML 文件,其中包含作者列表及其各自的元信息:
- authors:
- user: andre
name: Andre Santos
site: http://test.dev
email: andre@test.dev
- user: john
name: John Doe
site:
email: john.doe@test.dev
现在我想做两件非常简单的事情:首先,遍历所有作者,显示关于他们的一些信息:
{% for list in site.data.authors %}
{% for author in list %}
{{ author.user }} - {{ author.user.name }}
{% endfor %}
{% endfor %}
但它什么也没显示!
现在在代码的其他部分我只想从特定用户检索信息:
{% assign the_user = site.data.authors.authors[post.username] %}
{{ the_user.name }}
而且,它又一次什么也没显示!我不知道我做错了什么,我尝试了很多其他解决方案、迭代,但我无法确定如何迭代 YAML 文件,而且我不知道 Ruby 所以大多数当我将它们改编成 Jekyll + Liquid 时,我在这个网站上找到的解决方案对我不起作用。
我做错了什么?如何访问这些变量?
您可以简化您的数据文件:
- user: andre
name: Andre Santos
site: http://test.dev
email: andre@test.dev
- user: john
name: John Doe
site:
email: john.doe@test.dev
现在您可以像这样获取数据了:
<ul>
{% for author in site.data.authors %}
<li>{{ author.user }} - {{ author.name }}</li>
{% endfor %}
</ul>
或者像这样:
{% assign the_user = site.data.authors | where: "user", post.username | first %}
{{ the_user.name }}
问题已解决!
经过长时间的深思熟虑,我得到了一个非常简单的解决方案,基于 2 个步骤:从 YAML 更改为 JSON,然后理解 Jekyll returns a Ruby Hash 而不是一个数组。
所以,最后的文件,authors.json
:
{
"andre": {
"name": "Andre Santos",
"site": "http://test.dev",
"email": "andre@test.dev"
},
"john": {
"name": "John Doe",
"site": "",
"email": "john.doe@test.dev"
}
}
现在文件已更正,让我们注意选择其中一项并显示它。
{{ site.data.authors[post.author].name }}
如果post.author = "andre"
,模板将return Andre Santos
。第一个问题,解决了!
现在,Jekyll 非常愚蠢,仍然不能很好地与 JSON 一起工作。无论我们做什么,它都会迭代得很糟糕。那么,我们来分析一下下面的情况:
在一次测试中,我决定放弃迭代。所以:
{% for author in site.data.author %}
{{ author }}
----
{% endfor %}
它产生以下结果:
andre{"name"=>"Andre Santos", "site"=>"test.dev";, "email"=>"andre@test.dev"} ----
john{"name"=>"John Doe", "site"=>nil, "email"=>"john.doe@test.dev"} ----
此结果表明 Jekyll 生成的不是数组,而是哈希(注意 => 符号)。因此,让我们尝试将其作为哈希来处理。如果我尝试打印 {{ author[0]
,它将显示 andre
和 john
。出色的!因此,哈希的下一部分(元数据)实际上是 author[1].
显示信息的最终代码:
{% for author in site.data.authors %}
Username: {{ author[0] }}
Full Name: {{ author[1]["name"] }}
{% if author[1]["site"] != "" %}
Site: {{ author[1]["site"] }}
{% endif %}
E-Mail: {{ author[1]["email"] }}
-----
{% endfor %}
结果:
Username: andre
Full Name: Andre Santos
Site: http://test.dev
E-Mail: andre@test.dev
----
Username: john
Full Name: John Doe
E-Mail: john.doe@test.dev
----
哒哒!
因此,总结一下:放弃 YAML 并使用 JSON,使用简单的点符号和密钥从 JSON 的特定部分获取信息。使用for
时,将其作为Hash处理。代码变得有点难以处理,但至少它按我想要的方式工作。将来,如果 Jekyll 对 JSON 更认真一点,它可能会让我们更容易地迭代它。
谢谢大家!
我正在尝试建立一个 Jekyll 博客。但我以前从未使用过 YAML,我对这件事的逻辑感到很生气。
首先,我在 _data/authors.yml
中编写了一个 YAML 文件,其中包含作者列表及其各自的元信息:
- authors:
- user: andre
name: Andre Santos
site: http://test.dev
email: andre@test.dev
- user: john
name: John Doe
site:
email: john.doe@test.dev
现在我想做两件非常简单的事情:首先,遍历所有作者,显示关于他们的一些信息:
{% for list in site.data.authors %}
{% for author in list %}
{{ author.user }} - {{ author.user.name }}
{% endfor %}
{% endfor %}
但它什么也没显示!
现在在代码的其他部分我只想从特定用户检索信息:
{% assign the_user = site.data.authors.authors[post.username] %}
{{ the_user.name }}
而且,它又一次什么也没显示!我不知道我做错了什么,我尝试了很多其他解决方案、迭代,但我无法确定如何迭代 YAML 文件,而且我不知道 Ruby 所以大多数当我将它们改编成 Jekyll + Liquid 时,我在这个网站上找到的解决方案对我不起作用。
我做错了什么?如何访问这些变量?
您可以简化您的数据文件:
- user: andre
name: Andre Santos
site: http://test.dev
email: andre@test.dev
- user: john
name: John Doe
site:
email: john.doe@test.dev
现在您可以像这样获取数据了:
<ul>
{% for author in site.data.authors %}
<li>{{ author.user }} - {{ author.name }}</li>
{% endfor %}
</ul>
或者像这样:
{% assign the_user = site.data.authors | where: "user", post.username | first %}
{{ the_user.name }}
问题已解决!
经过长时间的深思熟虑,我得到了一个非常简单的解决方案,基于 2 个步骤:从 YAML 更改为 JSON,然后理解 Jekyll returns a Ruby Hash 而不是一个数组。
所以,最后的文件,authors.json
:
{
"andre": {
"name": "Andre Santos",
"site": "http://test.dev",
"email": "andre@test.dev"
},
"john": {
"name": "John Doe",
"site": "",
"email": "john.doe@test.dev"
}
}
现在文件已更正,让我们注意选择其中一项并显示它。
{{ site.data.authors[post.author].name }}
如果post.author = "andre"
,模板将return Andre Santos
。第一个问题,解决了!
现在,Jekyll 非常愚蠢,仍然不能很好地与 JSON 一起工作。无论我们做什么,它都会迭代得很糟糕。那么,我们来分析一下下面的情况:
在一次测试中,我决定放弃迭代。所以:
{% for author in site.data.author %}
{{ author }}
----
{% endfor %}
它产生以下结果:
andre{"name"=>"Andre Santos", "site"=>"test.dev";, "email"=>"andre@test.dev"} ----
john{"name"=>"John Doe", "site"=>nil, "email"=>"john.doe@test.dev"} ----
此结果表明 Jekyll 生成的不是数组,而是哈希(注意 => 符号)。因此,让我们尝试将其作为哈希来处理。如果我尝试打印 {{ author[0]
,它将显示 andre
和 john
。出色的!因此,哈希的下一部分(元数据)实际上是 author[1].
显示信息的最终代码:
{% for author in site.data.authors %}
Username: {{ author[0] }}
Full Name: {{ author[1]["name"] }}
{% if author[1]["site"] != "" %}
Site: {{ author[1]["site"] }}
{% endif %}
E-Mail: {{ author[1]["email"] }}
-----
{% endfor %}
结果:
Username: andre
Full Name: Andre Santos
Site: http://test.dev
E-Mail: andre@test.dev
----
Username: john
Full Name: John Doe
E-Mail: john.doe@test.dev
----
哒哒!
因此,总结一下:放弃 YAML 并使用 JSON,使用简单的点符号和密钥从 JSON 的特定部分获取信息。使用for
时,将其作为Hash处理。代码变得有点难以处理,但至少它按我想要的方式工作。将来,如果 Jekyll 对 JSON 更认真一点,它可能会让我们更容易地迭代它。
谢谢大家!