will_paginateに移行

will_paginateのアップデートによってインストール方法など一部の情報が古くなっています。

関連:will_paginateもgithubに行ってた

この間Rails2.0に移行したときにいったん放置したwill_paginateへの移行を行ったのでメモ。
それほど手間ではなかった。

ぐーぐる先生が教えてくれたページやREADMEを読みつつ作業。

プラグインのインストール

さくっと。

$ script/plugin install svn://errtheblog.com/svn/plugins/will_paginate

コントローラの修正

以下のようにコードを修正。コメントアウトしたものは修正前のもの。

def list
  # @pages, @items = paginate(:items, :conditions => ["deleted = 0"], :order => 'created_at desc', :per_page => 10)
  @items = Item.paginate(:page => params[:page], :conditions => ["deleted = 0"], :order => 'created_at desc', :per_page => 10)
end

モデルにpaginateというメソッドがつくっぽい。
引数の :page で表示するページ数を指定して、:per_page でページあたりの表示件数を指定する。
上記のコードでは表示するページ数はクエリのpageというパラメータから取るかんじ。

またpaginate_by_xxxというメソッドも使えるようになるので、

@items = Item.paginate_by_user_id @user.id, :page => params[:page]

のような使い方もできるようだ。

ビューの修正

ヘルパーを使うとそこにページネーションが表示される。

<%= will_paginate(@items) %>

これで終わり。

will_paginateってのはまあクラシックなページネーションのpagination_linksみたいなもんですな。

従来のページ管理オブジェクトが持っていたようなメソッドもActiveRecordオブジェクトのメソッドに付加される、あるいはもともとあるメソッドで代用できる模様。
互換性は意識されてないようなので、ページ管理オブジェクトを使ってがんばってオリジナルのページネーションを作っていた人はいろいろ書き換える必要がありそう。

メソッド 内容
size 総件数。
page_count 総ページ数。
per_page 1ページあたりの表示件数。
previous_page 現在のページの前のページ番号。存在しない場合はnil
next_page 現在のページの次のページ番号。存在しない場合はnil
offset 現在のページの最初のレコードのオフセット。

例えば以下のようにビューの中で使ったりできる。

<%= @items.page_count %>

will_paginateのオプション

オプションを与えると外観をカスタマイズできる。

オプション 内容 デフォルト値
:class ページネーションを囲むdivタグ(コンテナ)につくCSSクラス名 “pagination”
:prev_label 前のページへのリンクのラベル “≪ Previous”
:next_label 次のページへのリンクのラベル “Next ≫”
:inner_window 現在のページをの両隣何ページ分までリンクを表示するか 4
:outer_window 1ページ目と最後のページからそれぞれ何ページ分までリンクを表示するか 1
:separator ページとページの間のセパレータ ” ” (半角スペース)
:param_name ページ数を表すパラメータの名前。例えば “p” にすると “p=1” とか “p=3” とか言うクエリパラメータになる。 “page”
:params 各ページへのリンクにつける追加パラメータ。例えば :controller => “foo”, :action => nil など nil
:renderer リンクを描画するレンダラークラスを指定できる WillPaginate::LinkRenderer
:page_links 各ページへのリンクを表示するか否か。falseにすると各ページへのリンクは表示されず、前と次のページへのリンクのみ表示される。 true
:container ページネーションをdivタグ(コンテナ)で囲むか否か。 true
:id ページネーションを囲むdivタグ(コンテナ)のidを指定できる。
文字列でなくtrueを指定するとモデルのクラス名を小文字化したものに “_pagenation” がついたものになる。
nil

:inner_windowと:outer_windowの挙動が若干おかしいような気がしないでもない・・・

以下サンプルコード。

< %= will_paginate(@items, :prev_label => '前', :next_label => '次', :params_name => 'p') %>

前後のページに進むリンクのラベルを変更し、クエリストリングのページ番号を表すパラメータを「p」に変更している。
なお:params_nameを変えたらコントローラ側でも変更が必要になるので注意。

@items = Item.paginate(:page => params[:p], :per_page => 10)

スタイルを当てる

READMEに載っている次のスタイルを当てるとちょっとかっこよくなる。

.pagination {
  padding: 3px;
  margin: 3px;
}
.pagination a {
  padding: 2px 5px 2px 5px;
  margin: 2px;
  border: 1px solid #aaaadd;
  text-decoration: none;
  color: #000099;
}
.pagination a:hover, .pagination a:active {
  border: 1px solid #000099;
  color: #000;
}
.pagination span.current {
  padding: 2px 5px 2px 5px;
  margin: 2px;
  border: 1px solid #000099;
  font-weight: bold;
  background-color: #000099;
  color: #FFF;
}
.pagination span.disabled {
  padding: 2px 5px 2px 5px;
  margin: 2px;
  border: 1px solid #eee;
  color: #ddd;
}

paginationというクラス名はヘルパーのオプションで変更してたらそれにあわせること。

参考

will_paginate README
Ruby on Rails 2.0.1に対応 – idesaku blog

この投稿へのコメント

  1. 匿名 said on 2009年9月17日 at 7:48 PM

    size 総件数。ってのは、現在のページの件数ですよね。

コメントを残す

メールアドレスが公開されることはありません。