【will_paginate-bootstrap】パジネーションの文字を改造する
状況
パジネーションの「1,2,3,4....」とかの文字を変更したい。例えば、ランキングページを想定して、1ページに10エントリー表示する場合、「1~10位、11~20位、21~30位」と表示したい。
前提
- Ruby on Rails 4.2.10
解決
BootstrapPaginationクラスのpage_numberメソッドをオーバーライドする。 下記とは異なるが、will_paginate-bootstrapのソースコードからpage_numberメソッドをコピペしてきても動くはず。
コード
app/helper/ranking_paginate_helper.rbを新しく作成して下記を追加する。
module RankingPaginate class LinkRenderer < BootstrapPagination::Rails protected def page_number(page) unless page == current_page ranking_page = ranking_page(page) tag(:li, link(ranking_page, page, :rel => rel_value(page))) else ranking_page = ranking_page(page) tag(:li, link(ranking_page, '#', :rel => rel_value(page)), :class => "active disabled") end end end private def ranking_page(page) case page when 1 '1〜10位' else beginning = (page.to_i - 1) * 10 + 1 ending = beginning + 9 "#{beginning}〜#{ending}位" end end end
ビュー
= will_paginate collection, :renderer => RankingPaginateHelper::LinkRenderer
雑感
will_paginate-bootstrapをオーバーライドすればできそう、ということろまではすぐにたどり着いたものの、具体的にどうすれば、というのはわかりづらかった。 Rubyの一般的な知識として、「Ruby クラス オーバーライド」をキーワードにググり、以下のような記事を読んだ。 www.buildinsider.net
あとは、will_paginate-bootstrapがそもそもwill_paginateをオーバーライドしているので、ソースを見てやり方の検討をつけた。 will_paginate-bootstrap/bootstrap_renderer.rb at master · bootstrap-ruby/will_paginate-bootstrap · GitHub
そのあとは試行錯誤して正しい書き方を探り当てた。Rails consoleを立ち上げて、オーバライドしたクラス名を打ち込み、実行できるか試してみた。エラーが出たら何かがうまくいっていないということだ。あとはバグを解決して目的が達成できた。