スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

will_paginate導入

インストール

# gem install will_paginate

コントローラのactionで、

@users = User.paginate(:page => params[:page], :order => 'id desc', :per_page => 20)

  :page => params[:page] ← このまま。paginateのリンクのパラメータ名になる
  :order => 'id desc' ← idで降順に
  :per_page => 20 ← 20レコードずつ表示

とかして、viewに

<%= will_paginate(@apUsers) %>

を入れると、この部分がpaginateのリンクになる。

ただ、apacheのmod_rewriteで、例えば、

http://hogehoge.com/subdir/hogeappli/controller/action

http://localhost:3000/controller/action

みたいなrewriteをしていた場合、paginateのリンクが

http://hogehoge.com/contorller/action?page=…

みたいになって、subdir/hogeappli/の部分がなくなってしまう。

その場合、app/helper/にlink_renderer_mobapp.rbを作って、will_paginateのlink_renderer.rbのLinkRendererクラスを継承したクラス(ここではLinkRendererHogeを)作成する。

こんな感じ
require 'will_paginate'

class LinkRendererHoge < WillPaginate::LinkRenderer
protected

def url_for(page)
unless @url_string
@url_params = { :escape => false }
# page links should preserve GET parameters
stringified_merge @url_params, @template.params if @template.request.get?
stringified_merge @url_params, @options[:params] if @options[:params]

if param_name.index(/[^\w-]/)
page_param = (defined?(CGIMethods) ? CGIMethods : ActionController::AbstractRequest).
parse_query_parameters("#{param_name}=#{page}")

stringified_merge @url_params, page_param
else
@url_params[param_name] = page
end

url = @template.url_for(@url_params)
@url_string = url.sub(%r!([?&/]#{CGI.escape param_name}[=/])#{page}!, '\1@')
@url_string = '/subdir/hogeappli' + @url_string ← ここ追加!
return url
end
@url_string.sub '@', page.to_s
end
end

で、viewの記述を

<%= will_paginate(@apUsers) %>

から

<%= will_paginate(@apUsers, :renderer => LinkRendererHoge) %>

に変える。

これでpaginateのリンクも

http://hogehoge.com/subdir/hogeappli/controller/action?page=…

になる。

ただし、上記のmod_rewriteの設定をした上で、config/environments/production.rbとかに

config.action_controller.relative_url_root = '/subdir/hogeappli'

を設定した場合は、こういう風にする
require 'will_paginate'

class LinkRendererMobapp < WillPaginate::LinkRenderer
protected

def url_for(page)
unless @url_string
@url_params = { :escape => false }
# page links should preserve GET parameters
stringified_merge @url_params, @template.params if @template.request.get?
stringified_merge @url_params, @options[:params] if @options[:params]

if param_name.index(/[^\w-]/)
page_param = (defined?(CGIMethods) ? CGIMethods : ActionController::AbstractRequest).
parse_query_parameters("#{param_name}=#{page}")

stringified_merge @url_params, page_param
else
@url_params[param_name] = page
end

url = @template.url_for(@url_params)
@url_string = url.sub(%r!([?&/]#{CGI.escape param_name}[=/])#{page}!, '\1@')
return url
end
@url_string.sub('/subdir/hogeappli', '') if(@url_string =~ %r!^/subdir/hogeappli!) ← ここ追加!
@url_string.sub '@', page.to_s
end
end

viewの記述は同じ

<%= will_paginate(@apUsers, :renderer => LinkRendererHoge) %>

この記事のトラックバックURL

http://ysmt.blog21.fc2.com/tb.php/313-3beeddd6

コメント

コメントする

管理者にだけ表示を許可する

Template Designed by DW99

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。