Bootstrap4でwill_painateを使ってページネーション

ブログの記事一覧にページネーションを導入しようと、Railsチュートリアルの10章を参考にやってみたけどBootstrapがうまく反映されず。
調べてみたらBootstrap4だと少し違う方法になるようなので、まとめました。


前提

Rails: 5.2.1
Bootstrap4: 4.1.3

(今回導入するgem)
will_paginate: 3.1.6
bootstrap-will_paginate: 1.0.0


インストール

gemをインストールします

gem 'will_paginate'
gem 'bootstrap-will_paginate', '~> 1.0'

'will_paginate-bootstrap'という名前のgemもあるようですが、'bootstrap-will_paginate'の方でうまくいきました。

$ bundle install


使い方

まずオブジェクトを用意します。

ArticlesController.rb

  def index
    @articles = current_user.articles.paginate(:page => params[:page])
  end

 要は (オブジェクト).paginate(:page => params[:page]) 

インストールしたwill_pagenateによって:pageパラメータが生成され、値であるページ番号ごとにオブジェクトがまとめられます。

今回は1ページに記事を5つ、最新記事から先に表示したいので、以下のように追記します。

  def index
    @articles = current_user.articles.paginate(:page => params[:page], :per_page => 5).order('created_at DESC')
  end


次にビューで<%= will_paginate %>を使って呼び出します。
ここで注意したいのは、Bootstrap4だと

will_paginate((用意したオブジェクト),  :renderer => WillPaginate::ActionView::Bootstrap4LinkRenderer) 

という記述が必要になります。
今回は以下のようになりました。

show.html.erb

   <nav class="blog-pagination">
     <%= will_paginate(@articles, :renderer => WillPaginate::ActionView::Bootstrap4LinkRenderer)  %>
   </nav>



結果

f:id:naito-coding0322:20181017130933p:plain

このように、見た目の良いページネーションが実装できました。