Rails2.0でPaginateを使う

Rails2.0からPaginateが標準搭載されていません。ということで、pluginを導入してpaginationします。
Rails1.2と同様の物はclassic_paginationとしてplugin化されていますが、今回はwill_paginateを使います。
classicはこれからメンテされないとか、willの方が使いやすい気がするので、こちらがオススメです。

動作例は以下をご覧下さい。
http://nico.n-labo.net/video/view_m_per

インストール

% sudo gem install will_paginate

svn://errtheblog.com/svn/plugins/will_paginat から移動した模様。
config/environment.rb に以下を追加します。

require 'will_paginate'

モデルの設定

特別な設定はありません。
今回は例としてHogeモデルを使います。

class Hoge < ActiveRecord::Base
end

コントローラの設定

モデルからデータを取得します。

@page = Hoge.paginate(:page => params[:page], :per_page => 10,
                      :conditions => ['delflg = false'],
                      :order => 'updated_at DESC')

SQLで制御することもできます。

@page = Hoge.paginate_by_sql('SELECT * FROM hoges WHERE delflg = false ORDER BY updated_at DESC',
                             :page => params[:page], :per_page => 10)

ビューの設定

@pageから普通にHogeモデルのデータが取得できます。
ページナビゲーションは以下を埋め込んでください。

<%= will_paginate @page %>

取得件数を表示したい場合は以下を埋め込みます。

<%=@page.total_entries %>

スタイルシート

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;
}

SQL

paginateを実行した際、以下のようなSQLが実行されます。

SELECT `hoges`.* FROM `hoges` WHERE (delflg = false) ORDER BY updated_at DESC LIMIT 0, 10