Жидкость для цикла не работает должным образом в Джекил - PullRequest
4 голосов
/ 14 января 2012

Я использую цикл жидкости в Jekyll для отображения содержимого страницы на основе этой структуры YAML:

work_left:
  isitgo:
    image: /images/isitgo.png
    caption: isitgoonair.net homepage
    description: a website
  disko:
    image: /images/disko.png
    caption: Disko
    description: a website
work_right:
  qfi:
    image: /images/qfi.png
    caption: qfi.im
    description: a website

Это цикл for:

{% for item in page.work_left %}
    {{ item.image }}
{% endfor %}

item.imageне приведет к выводу строк /images/isitgo.png и /images/disko.png.
Если вместо этого я просто сделаю {{ item }}, вот результат:

isitgo
{
    "image"=>"/images/isitgo.png",
    "caption"=>"isitgoonair.net homepage",
    "description"=>"an awesome website i made"
}

disko
{
    "image"=>"/images/disko.png",
    "caption"=>"Disko",
    "description"=>"that site"
}

Что вызывает это?

Ответы [ 2 ]

17 голосов
/ 15 января 2012

Вы получаете эти результаты из-за того, как жидкость анализирует ассоциативные массивы - вот что такое work_left.На каждой итерации вы получаете два элемента: «ключ» и «значение».

Я предупреждаю вас, что в некоторых случаях это может создать вам проблемы.Примечательно, что порядок, в котором предметы будут появляться, не гарантирован - isitgo может появиться после дискотеки.(Насколько я знаю, это зависит от версии ruby, которую вы используете).

Если вы хотите убедиться, что вы всегда получаете содержимое work_left в том же порядке, вы должны использовать список ассоциативных массивов вместо ассоциативного массива ассоциативного массива, как вы, где делаете.Вот как это будет выглядеть:

work_left:
  - name: isitgo
    image: /images/isitgo.png
    caption: isitgoonair.net homepage
    description: a website
  - name: disko
    image: /images/disko.png
    caption: Disko
    description: a website
work_right:
  - name: qfi
    image: /images/qfi.png
    caption: qfi.im
    description: a website

Тогда код для их печати:

{% for item in page.work_left %}
  {{ item.name }}
  {{ item.image }}
{% endfor %}
2 голосов
/ 14 января 2012

Похоже, что элемент, созданный с помощью цикла for, должен рассматриваться как массив.

Итак, для моего случая:

{% for item in page.work_left %}
     {{ item[0] }}
{% endfor %}

Выведет первый элемент возвращенного массива (2 элемента), который представляет собой строку: isitgo disko. {{ item[1].image }} получит доступ к свойству .image второго элемента возвращаемого массива, переменной, и отобразит /images/isitgo.png /images/disko.png.

...