will_paginateはページングを行うための便利なライブラリです。
普通ActiveRecordと連携して使用することが多いと思うのですが、ActiveRecordと無関係に、普通の配列にも使えるようです。
APIを通じてデータを取得する場合などに使えそうです。
How to use will_paginate with non-ActiveRecord collection/array
(http://www.sharingb.com)
1. コレクションを取得する
ActiveRecordの場合
@posts = Post.paginate(:page => params[:page], :per_page => 10)(@postsはWillPaginate::Collectionクラスのインスタンスになります)
非ActiveRecordの場合
@posts = Post.perform_search_and_obtain_collection(params[:criteria])(@postsはデータの中味とデータの総数を参照できるオブジェクトを想定)
2. WillPaginate::Collection クラスのインスタンスを作成する
ここがポイントです。
非ActiveRecordの場合、WillPaginate::Collectionクラスのインスタンスを作成する必要があります。
@page_results = WillPaginate::Collection.create(params[:page], 10, @posts.total_results) do |pager|
pager.replace(@posts.items.to_array)
end引数には現在のページ、ページごとのデータ数、データの総数を渡します。
データ(@posts.items)が配列の場合はこのように書くこともできます。
@page_results = @posts.items.paginate({
:page => params[:page],
:per_page => 10,
:total_entries => @posts.total_results
})3: View
WillPaginate::Collectionクラスのインスタンスを作成したら、あとはActiveRecordと連携した場合と一緒です。
<ol>
<% for post in @page_results -%>
<li>Render `results` in some nice way.</li>
<% end -%>
</ol>
<p>Now let's render us some pagination!</p>
<%= will_paginate @page_results %>

0 comments:
コメントを投稿