2012-01-14 6 views
4

Я использую жидкость для цикла в Джекиле для отображения содержимого страницы на основе этой структуры 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 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" 
} 

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

ответ

17

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

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

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

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

Wow! Большое спасибо! Пробовал много за полчаса, но не знал, что у меня есть «-' в YAML. +1 – kaiser

2

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

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

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

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

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

  • Нет связанных вопросов^_^