読者です 読者をやめる 読者になる 読者になる

will_paginateでAjaxで遷移(ページ番号リンクをlink_to_remoteへ変更する)

Ruby Rails

will_paginateはページ番号を自動で出してくれるヘルパーがあって、

<%= will_paginate @users %>

これをviewに書くだけで、ページのリンクを出力してくれます。
でも、ページ遷移をajaxでやりたい場合はこのページのリンクも
link_to_remoteでやる必要があります。
そこで、helperに以下を書いておきます。

class RemoteLinkRenderer < WillPaginate::LinkRenderer
  def page_link_or_span(page, span_class, text = nil)
    text ||= page.to_s
    classnames = Array[*span_class]

    if page and page != current_page
      @template.link_to_remote text, :url => url_for(page)
    else
      @template.content_tag :span, text, :class => classnames.join(' ')
    end
  end
end

そして、以下のように呼び出します。

<%= will_paginate @users,:renderer=>"RemoteLinkRenderer"
%>

:rendererで上のRemoteLinkRendererを呼ぶように指定します。
Ajaxの呼出し先やパラメータを変えたいという時は

<%= will_paginate @users,:renderer=>"RemoteLinkRenderer",
  :params=>{:action=>"search"}
%>

とします。
Ajaxで呼び出された時のviewを用意し、
controllerのrespond_toで切り替えるようにします。

respond_to do |format|
  format.html # index.html.erb
  format.js
end

actionの最後にこのように書きます。
こうしておくと、通常のhtmlのリクエストの時は
index.html.erbが呼び出され、
ajaxのリクエストの時は
index.rjsが呼び出されます。
index.rjsの中身は

page.replace_html "user_list",:partial=>"user_list"

です。こうすると、id="user_list"になっている部分が
部分テンプレート_user_list.html.erbによって更新されます。