【问题标题】:How to iterate and retrieve from YAML _data in Jekyll?如何从 Jekyll 中的 YAML _data 中迭代和检索?
【发布时间】:2016-10-28 14:48:40
【问题描述】:

我正在尝试建立一个 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 时,这个网站对我不起作用。

我做错了什么?如何访问这些变量?

【问题讨论】:

  • 将 YAML 文件的第一行更改为 authors: 并使用用户名作为每个作者的密钥将修复它。否则,您在数组中有一个对象,而您正在访问作者,就好像它是一个对象中的一个对象。

标签: arrays ruby jekyll liquid


【解决方案1】:

问题解决了!

经过深思熟虑,我得到了一个非常简单的解决方案,基于 2 个步骤:从 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 没有产生一个数组,而是一个 Hash(注意 => 符号)。所以,让我们试着把它当作一个哈希来处理。如果我尝试打印{{ author[0],它将显示andrejohn。优秀的!因此,哈希的下一部分(元数据)实际上是作者 [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,它可能会让我们更容易地迭代它。

谢谢大家!

【讨论】:

    【解决方案2】:

    您可以简化数据文件:

    - 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 }}
    

    【讨论】:

    • for 不起作用。它只打印 - -,因此它既不显示 author.user 也不显示 author.user.name。杰基尔太古怪了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多