kaminariを試してみました

#254 Pagination with Kaminari - RailsCasts
ASCIIcasts - “Episode 254 - Kaminariでページ分割”
を見て、以前から気になっていた kaminari を試してみました。
試した結果は、こちら


ちなみに

mislav/will_paginate - GitHub

現行バージョンはRails 3をサポートしていません

と紹介されていますが、これは当時の情報で
現在は、サポートされています。


なので、無理にkaminariに移行する必要はありませんが
kaminariの方がカスタムページを作成しやすかったり、will_paginateより利点がありそうです。
will_paginateだと、カスタム用クラスを作成して
ごちゃごちゃやる必要(一例)があったりしますが
kaminariだと、

$ rails g kaminari:views default

でerbを直接修正できるようです。


また、ajaxの対応が簡単後述)だったり
autopagerizeも対応可能だそうです。


移行方法

割と簡単です。すぐできます。

view
# before
will_paginate

# after
paginate
model/controller
# before
paginate(:page => page, :per_page => per_page)

# after
page(page).per(per_page)

will_paginateには next_page というメソッドが用意されていましたが
kaminari では、これに変わるものとして num_pages が利用できます。

# before
<% if tag_cloud.next_page %>

# after
<% if tag_cloud.num_pages > 1 %>

ajax

view

paginateの引数 remote を設定してやります。xhrで通信されます。

<%= paginate projects_list, :remote => true %>
controller

respond_to にjsを追加。

respond_to do |format|
  format.html
  format.js if request.xhr?
end
js.erbを追加

下記のように、jqueryで更新処理を書きます。

$("#project_list").html("<%= escape_javascript(render :partial => 'shared/projects_list',:object => @projects) %>");

おまけ


でも、総scoreでは、まだwill_paginateが上のようです。


追記

kaminari の paginate_array が便利 - それはBlog
paginate_arrayで配列そのものも扱えるようです。(要はfind(:all)の結果が扱えると)