Посредник: выбор информации из файлов данных в передней части

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

Пример

У меня есть файл данных, расположенный по адресу data/cta.yaml, с различными вариантами текста призыва к действию, который может повторяться на разных страницах, что означает, что каждый текст призыва к действию можно использовать более чем на одной странице.

data/cta.yaml:

basic: This is default CTA
special: Something special here
other: Some other CTA

Тогда у меня layout.erb:

<body>
<%= yield %>
<p class="cta">No data yet</p>
</body>

И test.html.erb:

---
title: Some page for testing
cta: It works with layout if I do not reference 'data/cta.yaml'
---

Some page content.

Если я хочу использовать, скажем, первый текст CTA, я могу использовать <p class="cta"><%= data.cta.basic %></p> либо в layout.erb файле макета, либо удалить его из макета и переместить прямо в конец файла шаблона test.html.erb. Или я мог бы полностью отбросить файл данных и просто ввести текст CTA для каждой страницы в начале. Однако я бы предпочел сохранить текст CTA в файле данных и весь HTML в layout.erb, а затем иметь возможность «выбирать» информацию из cta.yaml в test.html.erb frontmatter.

Я пытался изменить

<p class="cta"><%= data.cta.basic %></p>

in layout.erb to

<p class="cta"><%= current_page.data.cta %></p>

а затем в test.html.erb frontmatter:

---
title: Some page for testing
cta: data.cta.basic
---

но это привело к дословному data.cta.basic тексту вместо «Это CTA по умолчанию» из cta.yaml файла данных.

Вопрос

Можно ли вообще использовать frontmatter, чтобы выбрать, какой текст из файла данных следует использовать для данной страницы?


person Rafal    schedule 18.04.2017    source источник
comment
То, что вы описываете, является ожидаемым поведением, поскольку передняя часть анализируется до ERB. Правильно ли я полагаю, что иногда вы хотите установить ручной CTA в передней части test.html.erb, а иногда хотите ссылаться на CTA, удерживаемую в data/cta.yml, из передней части test.html.erb?   -  person Andy Stabler    schedule 19.04.2017
comment
Не совсем так: для большинства страниц (использующих конкретный макет, который включает абзац с классом cta) я хочу иметь возможность ссылаться на CTA, содержащийся в data/cta.yaml, из передней части test.html.erb. Все дело в том, чтобы редактировать CTA в одном месте (data/cta.yaml) без необходимости редактировать его вручную на каждой странице, которая использует этот текст (если текст изменится в будущем). Ручной текст CTA был там, чтобы показать, что он работает при вводе вручную;)   -  person Rafal    schedule 20.04.2017


Ответы (1)


Как я уже упоминал в своем комментарии, фронтматтер анализируется до ERB, поэтому вы видите data.cta.basic вместо правильного cta.

Однако вы можете добавить помощника для этого.

Вот мой помощник

module CtaHelpers
  def page_cta
    cta = current_page.data.cta
    data.cta.send(cta)
  end
end

Вот мой test.html.erb файл:

---
cta: special
---
<p class="cta"><%= page_cta %></p>

Файл test.html.erb вызывает помощник, который определяет из Frontmatter, какой призыв к действию использовать, поэтому на выходе получается:

Здесь что-то особенное

person Andy Stabler    schedule 20.04.2017
comment
Прекрасно работает! Я использовал <%= page_cta %> в своем макете (как и предполагалось изначально, но он также работает в шаблонах страниц, как показано в ответе) и поместил помощник в свой config.rb (вместо того, чтобы сохранять его как отдельный модуль. - person Rafal; 01.05.2017