首页 文章

如何在Jekyll中从YAML _data迭代和检索?

提问于
浏览
0

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

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

2 回答

  • 1

    问题解决了!

    经过一番长时间的考虑,我得到了一个非常简单的解决方案,基于两个步骤:从YAML更改为JSON,然后理解Jekyll返回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" ,模板将返回 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] ,它将显示 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,它可能会让我们更容易迭代它 .

    谢谢你们!

  • 1

    您可以简化数据文件:

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

相关问题