middleman-blogでpaginationの変数をpartialやlayoutでも使う方法

middleman

paginationに関する変数をpartialやlayoutで使うと何も表示されない

middleman-blogでは、paginationのナビゲーションを作るために以下のような変数が使えます。

1
2
3
4
5
6
7
8
9
10
paginate
per_page
page_articles
articles
page_number
num_pages
page_start
page_end
next_page
prev_page

ただ、これらはテンプレートのファイル内で使用される想定しかされておらず、partialやlayoutで使用すると、nilが入っている状態になり、画面には何も表示されません。

なので、それぞれのテンプレート内にこのナビゲーションを書く必要があり、重複したコードとなってしまいます。

解決策

これらの変数に入るべき情報が、current_page.metadata[:locals]という配列に入っています。こちらはpartialでもlayoutからでもアクセスできます。下の例はこのサイトのpaginationのナビゲーションを作るpartialです。このコードをlayoutに書いても動きます。

_pager.slim

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
- paginate    = current_page.metadata[:locals]["paginate"]
- num_pages   = current_page.metadata[:locals]["num_pages"]
- page_number = current_page.metadata[:locals]["page_number"]
- prev_page   = current_page.metadata[:locals]["prev_page"]
- next_page   = current_page.metadata[:locals]["next_page"]

- if paginate && num_pages > 1
  .pager
    - if prev_page
      = link_to prev_page, class: "btn pager__prev"
        i.fa.fa-chevron-left
        |前のページ
    - else
      .pager__prev
    span.pager__nums
      = page_number
      |/
      = num_pages
    - if next_page
      = link_to next_page, class: "btn pager__next"
       | 次のページ
       i.fa.fa-chevron-right
    - else
      .pager__next

ナビゲーションだけでなく一覧表示部分もpartialやlayoutに書ける

一覧表示部分は通常こんな感じのコードをテンプレートに書きますよね。

1
2
3
- page_articles.each do |article|
  article
    h2= article.title

page_articlescurrent_page.metadata[:locals]に入っています。なので、下のように1行追加してあげるだけで、これをpartialやlayoutに入れられます。

1
2
3
4
- page_articles = current_page.metadata[:locals]["page_articles"]
- page_articles.each do |article|
  article
    h2= article.title

私の場合は、一覧表示系のテンプレート(index.slim、tag.slim、category.slim、calendar.slim)についてはlist_layout.slimというlayoutを使うようにし、このlayout内に上記の一覧表示のコードを書いています。また、最初の_page.slimというpartialもこのlayout内から呼び出すようにしています。

※middleman-blogのバージョン:v3.6.0.beta.2

羊毛や小麦