ページ切替を使う

1ページ○行としてページごとに表示するためのプラグインがRails2.0の「will_paginate」です。これを入れてみます。

インストール

こちら(→will_paginateのインストール方法が変わっていた - idesaku blog)を参考に入れてみます。

C:\www\2.5-55.jp> gem sources -a http://gems.github.com/
Bulk updating Gem source index for: http://gems.github.com/
Need to update 12 gems from http://gems.rubyforge.org
............
complete
http://gems.github.com/ added to sources
C:\www\2.5-55.jp> gem install mislav-will_paginate
Successfully installed mislav-will_paginate-2.3.1
Installing ri documentation for mislav-will_paginate-2.3.1...
Installing RDoc documentation for mislav-will_paginate-2.3.1...

rubygemsGitHubリポジトリとして追加してからインストールという手順です。特になんの問題もありません。

設定

「myapp/config/environment.rb」の最後(endのあと)に次の2行を追加します。

gem 'mislav-will_paginate', '~> 2.2' # → バージョン2.2以降、3未満
require 'will_paginate'

使い方

テストとして、「myapp/app/controllers/items_controller.rb」に indexとは別で listアクションを追加することにします。

class ItemsController < ApplicationController
  # GET /items
  # GET /items.xml
  def index
    @items = Item.find(:all)
    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @items }
    end
  end

  def list
    @items = Item.paginate :page => params[:page], :per_page => 4, :order => 'created_at desc'
    respond_to do |format|
      format.html # list.html.erb
      format.xml  { render :xml => @items }
    end
  end

この記述で「1ページ当たり4行、created_atフィールドの降順」という指定になります。
実際に使っているのは「myapp/app/views/items/list.html.erb」の中です。

<h1>Listing items</h1>
<table>
  <tr>
    <th>Itemname</th>
    <th>Itemcode</th>
           :
           :
    <th>Genreid</th>
  </tr>
<% for item in @items %>
  <tr>
    <td><%=h item.itemName %></td>
    <td><%=h item.itemCode %></td>
           :
           :
    <td><%=h item.genreId %></td>
    <td><%= link_to 'Show', item %></td>
    <td><%= link_to 'Edit', edit_item_path(item) %></td>
    <td><%= link_to 'Destroy', item, :confirm => 'Are you sure?', :method => :delete %></td>
  </tr>
<% end %>
</table>
<br />
<%= will_paginate @items, :class => 'flickr_pagination' %>
<br />
<%= link_to 'New item', new_item_path %>

サンプルでついてきたflickr風のスタイルシートを適用してみました。スタイルシートWindowsの場合、このあたり(C:\ruby\lib\ruby\gems\1.8\gems\mislav-will_paginate-2.3.1\examples)にあると思いますので、このなかの「pagination.css」を「myapp/public/stylesheets」にコピーします。
で、スタイルシートを読み込んでいる「myapp/app/views/layouts/items.html.erb」に「pagination.css」を追加してあげればOKです。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
  <title>Items: <%= controller.action_name %></title>
  <%= stylesheet_link_tag 'scaffold'<span class="lookcolor">,'pagination'</span> %>
</head>

主なオプション

使いそうなオプションのみ抜粋。( )内は指定しない場合のデフォルト。

  • :class divのclass名を指定する。( "pagination" )
  • :prev_label 前ページへのリンクラベル( "≪ Previous")
  • :next_label 次ページへのリンクラベル( "Next ≫")
  • :inner_window 現在のページの両隣何ページ分表示するか( 4 )
  • :outer_window 1ページ目と最後のページからそれぞれ何ページ分表示するか( 1 )
  • :separator ページ間のセパレータ( " " )
  • :page_links 各ページへのリンクを表示するか( true )。falseだと前後のページのみリンク。
  • :container divで囲むか ( true )
  • :id divのidを指定( nil )

参考

  1. ザリガニさん(→AutoPagerizeなwill_paginateにしておく - ザリガニが見ていた...。)にはいつもお世話になっています。
  2. インストール方法その他については、こちら(→will_paginateのインストール方法が変わっていた - idesaku blog)を参考にさせていただきました。
  3. 詳しい使い方はこちら(→http://brass.to/blog/will_paginate.html)を参照したほうがいいです。