複数モデルを個別にPaginateさせたい
複数モデルを1画面で一気に取り扱う一覧表示画面があって、登録されている
数はもちろんばらばらなわけだ。
こういうときに個別にページネーションさせるとなるとAjaxを使う必要がある。
基本的なAjaxでのPaginationはRoR翻訳Wikiのページなどを見ればすぐに出てくる。
How to Paginate With Ajax
でもこれのやり方だとひとつ困ったことになる。
Mike Gaffneyさん?のApplicationHelperにモジュールを追加させたメソッド
ではアクションの指定がおかしい。場所はここ
サンプルのビューは次のようになっている。
params = (page_options[:params] || DEFAULT_OPTIONS[:params]).clonepagination_links_each(paginator, page_options) do |n|
params[name] = n
ajax_options[:url] = params
これだとなぜかajax_optionsの:urlはpage_optionsに: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'))} %>
設定されていることになっているが、設定されておらず当然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'
enddef 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]).clonepagination_links_each(paginator, page_options) do |n|
params[name] = n
ajax_options[:url] = params
これでdiv id="ItemList"のところだけでPaginateされるようになった。
<%= 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'))} %>
他のモデルについても同様にしていくことで対応した。