will_paginateに移行
この間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
“will_paginateに移行” に対して1件のコメントがあります。
コメントは受け付けていません。
size 総件数。ってのは、現在のページの件数ですよね。