Вывод данных с помощью erb и middleman

Я хочу вывести некоторые данные, и я не уверен, возможно ли это или нет без изменения моего файла данных. В основном у меня есть YAML-файл со следующей структурой

 items: 
   - category: red
     name: super fun times
     note: likes fun
   - category: red
     name: sunshine
     note: wear sunglasses
   - category: blue
     name: crazy face
     note: avoid.

То, что я делаю, проходит через так

<% data.options.items.each do |q| %>
  <h2><%= q.category %></h2>
  <p><%= q.name %></p>
<% end %>

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

<h2>red</h2>
<p>super fun times</p>
<p>sunshine</p>

<h2>blue</h2>
<p>crazy face</p>

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

1 ответ

Решение

Подход, который вы можете использовать, использует group_to сгруппировать элементы по их группам, в результате чего получим наборы массивов для каждой категории:

<% data.options.items.group_by(&:category).each do |group| %>
  <h2><%= group.first %></h2>
  <% group.last.each do |item| %>
    <p><%= item.name %></p>
  <% end %>
<% end %>

В этом сценарии работает group_by На коллекцию предметов предоставляется объект следующего формата:

{"red"=>[{"category"=>"red", "name"=>"super fun times", "note"=>"likes fun"}, 
{"category"=>"red", "name"=>"sunshine", "note"=>"wear sunglasses"}],
"blue"=>[{"category"=>"blue", "name"=>"crazy face", "note"=>"avoid."}]}

Это позволяет затем выполнять итерацию по объекту, упрощая разделение групп в разметке.

Надеюсь, поможет!

Другие вопросы по тегам