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_articles
もcurrent_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