1

Middleman 静的ページ ジェネレーターを使用しており、frontmatter での選択に基づいてデータ ファイルから情報を取得したいと考えています。

さまざまなページで繰り返すことができる Call-To-Action テキストのさまざまなバリアントを含むデータ ファイルが にありdata/cta.yamlます。つまり、各 CTA テキストを複数のページで使用できます。

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 を保持してから、frontmatterlayout.erbから情報を「選択」できるようにしたいと考えています。cta.yamltest.html.erb

変えてみた

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

layout.erb_

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

そしてtest.html.erb前付で:

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

しかし、それはデータファイルdata.cta.basicからの「これはデフォルトのCTAです」ではなく、逐語的なテキストになりました。cta.yaml

質問

データファイルから特定のページに使用するテキストを選択するために frontmatter を使用することはまったく可能ですか?

4

1 に答える 1

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ファイルは、使用する CTA を Frontmatter から決定するヘルパーを呼び出しているため、出力は次のようになります。

ここに何か特別なものがあります

于 2017-04-20T08:00:34.030 に答える