2016-10-28 4 views
0

Я пытаюсь создать блог Jekyll. Но я никогда раньше не использовал YAML, и я схожу с ума от логики этой вещи.Как перебирать и извлекать из YAML _data в Jekyll?

Сначала я написал файл YAML в _data/authors.yml со списком авторов и их соответствующих мета-информации:

- authors: 
    - user: andre 
     name: Andre Santos 
     site: http://test.dev 
     email: [email protected] 

    - user: john 
     name: John Doe 
     site: 
     email: [email protected] 

Теперь я хочу сделать две очень простые вещи: во-первых, перебирать всех авторов, отображая некоторые данные о них:

{% 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.

Что я делаю неправильно? Как получить доступ к этим переменным?

+0

Изменение первой строки вашего файла YAML на 'authors:' и использование имени пользователя в качестве ключа для каждого автора будет исправлять его. В противном случае у вас есть объект в массиве, в то время как вы обращаетесь к автору, как если бы это был объект внутри объекта. –

ответ

0

Проблема решена!

После некоторого длительного обсуждения я получил очень простое решение на основе двух шагов: переход от YAML к JSON, а затем понимание Jekyll возвращает Ruby Hash вместо массива.

Таким образом, конечный файл, authors.json:

{ 
    "andre": { 
     "name": "Andre Santos", 
     "site": "http://test.dev", 
     "email": "[email protected]" 
    }, 
    "john": { 
     "name": "John Doe", 
     "site": "", 
     "email": "[email protected]" 
    } 
} 

Теперь, когда файл будет исправлена, давайте заботиться о выборе одного из его элементов и показывать его.

{{ site.data.authors[post.author].name }} 

Если post.author = "andre", шаблон будет возвращать Andre Santos. Первая проблема, решена!

Теперь Джекил довольно глупый и все еще не работает отлично с JSON. Независимо от того, что мы делаем, он будет плохо работать с ним. Итак, давайте проанализируем следующую ситуацию:

В тесте я решил сбросить итерацию. Итак:

{% for author in site.data.author %} 
    {{ author }} 
    ---- 
{% endfor %} 

Он производит следующий результат:

andre{"name"=>"Andre Santos", "site"=>"test.dev";, "email"=>"[email protected]"} ---- 
john{"name"=>"John Doe", "site"=>nil, "email"=>"[email protected]"} ---- 

Этот результат показывает Джекил не производит массив, но Хэш (уведомление Символ =>). Итак, давайте попробуем разобраться с ним как с хэшем.Если я попытаюсь напечатать {{ author[0], он покажет andre и john. Отлично! Итак, следующая часть хэша (метаданные), на самом деле автор [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: [email protected] 
---- 
Username: john 
Full Name: John Doe 
E-Mail: [email protected] 
---- 

Та да!

Итак, чтобы обернуть его: отпустите YAML и используйте JSON, получите информацию из определенной части JSON, используя простую точечную нотацию и ключ. При использовании for, рассматривайте его как хэш. Код становится немного сложнее в работе, но по крайней мере он работает так, как я хотел. В будущем, если Jekyll возьмет JSON немного более серьезно, это, вероятно, позволит нам повторить его немного легче.

Спасибо всем!

1

Вы можете упростить файл данных:

- user: andre 
    name: Andre Santos 
    site: http://test.dev 
    email: [email protected] 

- user: john 
    name: John Doe 
    site: 
    email: [email protected] 

Теперь Вы можете получить ДАННЫЕ, как это:

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

The for не работал. Он печатает только - -, поэтому он не показывает author.user ни author.user.name. Джекил такой дурацкий. – user3430483

Смежные вопросы