技術メモ

書いておぼえるブログ

【will_paginate-bootstrap】パジネーションの文字を改造する

状況  

パジネーションの「1,2,3,4....」とかの文字を変更したい。例えば、ランキングページを想定して、1ページに10エントリー表示する場合、「1~10位、11~20位、21~30位」と表示したい。

前提  

解決  

BootstrapPaginationクラスのpage_numberメソッドをオーバーライドする。   下記とは異なるが、will_paginate-bootstrapのソースコードからpage_numberメソッドをコピペしてきても動くはず。

will_paginate-bootstrap/bootstrap_renderer.rb at master · bootstrap-ruby/will_paginate-bootstrap · GitHub

コード  

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を立ち上げて、オーバライドしたクラス名を打ち込み、実行できるか試してみた。エラーが出たら何かがうまくいっていないということだ。あとはバグを解決して目的が達成できた。