【问题标题】:How to access object from _config.yml with reference from post in Jekyll?如何参考 Jekyll 中的帖子从 _config.yml 访问对象?
【发布时间】:2014-07-29 13:06:32
【问题描述】:

对于每篇文章,我都希望有作者和指向他页面的链接。所以我需要在帖子中有用户名:

---
title: "Some Post"
author: user_x
---

并且在 _config.yml 中有这样的东西

users:
 -
   user_x:
       url: "/some-url"
       name: "Full Name"

拥有映射用户 -> url 和名称,我如何在帖子中显示它?我试过这个:

<a href="">{{ site.users[ post.author ].name }}</a>

但是得到了对象而不是名称值。我也尝试在用户之后不使用-,而是使用与结果相同的对象

【问题讨论】:

    标签: yaml jekyll liquid


    【解决方案1】:

    使用page.author,而不是post.author

    <a href="">{{ site.users[page.author].name }}</a>
    

    您的 Yaml 应该如下所示:

    users:
      user_x:
        url: "/some-url"
        name: "Full Name"
      user_y:
        url: "/some-other-url"
        name: "A Different Name"
    

    如果您使用来自用户的多个值,您可能希望使用 assign

    {% assign user = site.users[page.author] %}
    
    <a href="{{ user.url }}">{{ user.name }}</a>
    

    【讨论】:

    • 嘿,你知道吗,Angular.js 中是否有类似assign 的东西?
    【解决方案2】:

    你可以为此编写一个小插件:

    module Jekyll
      module AuthorData
        def author_name(username)
          users = @context.registers[:site].config['users']
          users.detect { |hash| hash.keys.include? username }.values.first['name']
        end
    
        def author_url(username)
          users = @context.registers[:site].config['users']
          users.detect { |hash| hash.keys.include? username }.values.first['url']
        end
    
        def author(username, value)
          users = @context.registers[:site].config['users']
          users.detect { |hash| hash.keys.include? username }.values.first[value]
        end
    
      end
    end
    
    Liquid::Template.register_filter(Jekyll::AuthorData)
    

    现在,在index.html(这是我测试的页面)内,我可以使用以下代码获取作者的姓名和网址:

    {% post.author | author_name %}
    {% post.author | author_url %}
    

    或者,您可以使用通用过滤器:

    {% post.author | author: 'name' %}
    

    YAML 前端:

    作者:'user_x'

    _config.yml 文件:

    users:
      - user_x:
          url: '/test_x'
          name: 'User X'
      - user_y:
          url: '/test_y'
          name: 'User Y'
    

    @context.registers 是 Jekyll 提供访问应用程序内部数据以在插件中使用的方式。查看protip below the filters docs

    PS:我认为那里的文档存在一些不一致之处——或者可能是我正在使用的 Jekyll 版本——但我无法通过 context 方法访问该站点,因此不得不求助于使用实例变量。

    【讨论】:

    • 不写 ruby​​ 代码就不可能吗?我已经开始学习 Jekyll,还没有研究过插件。
    • AFACS,没有。您需要编写代码以至少从哈希数组(即users)中获取 url/名称。
    • 那么最好创建更通用的解决方案,从哈希中获取字段,例如下划线中的pluck。是否可以有像 Angular.js pluck:'name' 或 twig pluck('name') 这样的参数?
    • 是的,您可以将参数传递给过滤器。会更新答案
    • @jcubic 刚刚用另一种获取信息的方式更新了答案。这个想法是你可以随心所欲地构建过滤器,就像你可以在 Angular 的默认过滤器上添加插件一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多