Arrays 如何在Jekyll中迭代和检索YAML_数据?

Arrays 如何在Jekyll中迭代和检索YAML_数据?,arrays,ruby,jekyll,liquid,Arrays,Ruby,Jekyll,Liquid,我正试图建立一个杰基尔博客。但我以前从未使用过YAML,我对这件事的逻辑感到很疯狂 首先,我在\u data/authors.yml中编写了一个YAML文件,其中包含作者列表及其各自的元信息: - authors: - user: andre name: Andre Santos site: http://test.dev email: andre@test.dev - user: john name: John Doe

我正试图建立一个杰基尔博客。但我以前从未使用过YAML,我对这件事的逻辑感到很疯狂

首先,我在
\u 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 }}
问题解决了

经过长时间的思考,我得到了一个非常简单的解决方案,它基于两个步骤:从YAML更改为JSON,然后理解Jekyll返回一个Ruby哈希而不是数组

最后一个文件,
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”
,模板将返回
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
时,将其作为散列处理。代码变得更难处理,但至少它按照我的要求工作。将来,如果Jekyll更认真地对待JSON,它可能会让我们使用它把它放轻松一点


谢谢大家!

for不起作用。它只打印---,所以它不显示author.user,author.user.name.Jekyll也不显示。将YAML文件的第一行更改为
authors:
并使用用户名作为每个作者的密钥可以修复它。否则,在访问作者将其视为对象中的对象。