複数モデルを個別にPaginateさせたい

複数モデルを1画面で一気に取り扱う一覧表示画面があって、登録されている

数はもちろんばらばらなわけだ。

こういうときに個別にページネーションさせるとなるとAjaxを使う必要がある。

基本的なAjaxでのPaginationはRoR翻訳Wikiのページなどを見ればすぐに出てくる。

How to Paginate With Ajax

でもこれのやり方だとひとつ困ったことになる。

Mike Gaffneyさん?のApplicationHelperにモジュールを追加させたメソッド

ではアクションの指定がおかしい。場所はここ


params = (page_options[:params] || DEFAULT_OPTIONS[:params]).clone

pagination_links_each(paginator, page_options) do |n|
params[name] = n
ajax_options[:url] = params

サンプルのビューは次のようになっている。

<%= pagination_links_remote @user_pages, {:window_size => 2},
{:update => 'UserList',
:complete => visual_effect(:blind_down, 'UserList'),
:before => %(Element.show('spinner')),
:success => %(Element.hide('spinner'))} %>
これだとなぜかajax_optionsの:urlはpage_optionsに:paramsという形で

設定されていることになっているが、設定されておらず当然nilなので

空情報となってしまう。従って現在のアクションを呼び出す動きをしてくれるのだが

これがいただけない。

今問題にしている一覧は複数のモデルのlist集合のようなものになっている。

それぞれを呼び出してもらわないとよろしくないのだ。

例えばitemの一覧とmemberの一覧を同じビューで表示させているとする。

それぞれをAjaxで呼んでpaginateさせるためにメソッドを分ける。


def item_page
user_id = session[:user_id] ||= ''
@item_pages, @items = paginate :items, :per_page => 10, :conditions => ["user_id = ? ", issue_id]
render_partial '_item_list'
end

def member_page
user_id = session[:user_id] ||= ''
@member_pages, @members = paginate :members, :per_page => 10, :conditions => ["user_id = ? ", issue_id]
render_partial '_member_list'
end

これらのアクションに飛ぶことで部分的に書き換える。

これを指定させるためにはurlを指定しなければ。

というわけで、さっきのpage_optionsの:paramsという謎のシンボルを呼び出していた

ところを、次のように書き換えた。


params = (page_options[:url] || DEFAULT_OPTIONS[:params]).clone

pagination_links_each(paginator, page_options) do |n|
params[name] = n
ajax_options[:url] = params

あまりよろしくない気がするが、とりあえずビューの方も次のようにする。


<%= pagination_links_remote @user_pages, {:url => {:action => 'item_page'}},
{:update => 'ItemList',
:complete => visual_effect(:blind_down, 'ItemList'),
:before => %(Element.show('spinner')),
:success => %(Element.hide('spinner'))} %>
これでdiv id="ItemList"のところだけでPaginateされるようになった。

他のモデルについても同様にしていくことで対応した。