light log

学んだこととか

will_paginateの出力をカスタマイズする

昨日↓の続き。今日も少し。

yamacent.hatenablog.com

トータル件数の上限を指定する

ページごとの件数上限指定は、昨日も書いた通り:per_pageを設定することで可能。

ただ、ページネーションしたいモデルの全件数が多い場合に、per_page: 20とかで表示するとページが何千ページとかに及んで邪魔だったので、最大ページ数を指定できないものかと思って調べた。

最初、モデルに対してlimit(100)として、その結果に対してpaginateすればいいかと思ったけどダメだった。全件表示される。

で、調べたら公式のAPI documentation(wiki)では見つからなかったけど、Stack Overflowで以下の回答が見つかった。

ruby on rails - Limit number of pages in will_paginate - Stack Overflow

回答によると、:total_entriesを指定する。

@posts = Post.order(created_at: :desc)
  .paginate(page: params[:page], per_page: 20, total_entries: 20 * 100)

:total_entriesで指定するのは最大ページ数じゃなくてトータル件数なので、「:per_pageで指定した件数 * ページ数」を指定する。(この例だと100ページ)

ただし、これで一応動いたものの、公式のドキュメントに記載が見つからないしStack Overflowの回答も結構古いものなので、使っていいものなのかいまいち自信がない。これが仮に非推奨だとしたら、これに相当する代替手段はあるはずだと思うんだけど。

表示のカスタマイズ

こっちはちゃんと公式ドキュメントに載ってたので安心。

  <%= will_paginate @posts, renderer: BootstrapPagination::Rails,
    previous_label: '&#8592; &nbsp;前', next_label: '次 &#8594;',
    inner_window: 1, outer_window: 0 %>
  • :previous_label - 前ページに戻るリンクのラベル
  • :next_label - 次ページへ進むリンクのラベル
  • :inner_window - 現在ページの周りに表示するリンク数 (default: 4)
  • :outer_window - 最初と最後のページの周りに表示するリンク数 (default: 1)

他にもあるので詳しくは公式ドキュメント参照。

まとめ

とても便利だけど、:total_entriesが気がかり。

過去記事

yamacent.hatenablog.com

yamacent.hatenablog.com