dm-pagerを試す


dm-pagerを試したのでメモ

前準備


wikipediaから日本の国道データを引っ張ってきてsqliteに突っ込んだ。
sinatraでdatamapperを使って表示。


app.rb

...

get '/' do
  @roads = Road.all
  haml :index
end

...

インストール

gem install dm-pager

とりあえず表示


app.rb

...

get '/' do
  @roads = Road.page    #変更
  haml :index
end


...


views/index.haml

...

= @roads.pager.to_html "/"    #追加


あとCSSでページのリンクを横並びにする。


ページの切り替え


このままではページのリンクを押してもページが切り替わらない。
ページのリンクからpageパラメータが渡されるので、それをpageメソッドに渡す必要がある。


app.rb

...

get '/' do
  cur_page = params[:page] ? params[:page].to_i : 1    #追加

  @roads = Road.page cur_page                          #変更
  haml :index
end


...

デフォルトの変更


デフォルトだと1ページにつき6件表示して
ページのリンクは7ページ分表示するようになっている。
これを変更するには :per_page:size オプションを使う。


app.rb

...

get '/' do
  cur_page = params[:page] ? params[:page].to_i : 1

  @roads = Road.page cur_page,  :per_page => 8    #変更
  haml :index
end

...


views/index.haml

...

= @roads.pager.to_html "/", :size => 5    #変更



ページのリンクの「Next」「Last」「...」などは下記のオプションで変更する。

  • :first_text
  • :previous_text
  • :next_text
  • :last_text
  • :more_text


app.rb

...

configure do
  ...

  PAGER_OPT =                      #追加
    { :size => 5,                 #追加
      :first_text => '最初',       #追加
      :previous_text => '前へ',    #追加
      :next_text => '次へ',        #追加
      :last_text => '最後' }       #追加
end

...


views/index.haml

... 

= @roads.pager.to_html "/", PAGER_OPT    #変更


現在のページはリンクじゃない方が良くない?


ソースを見てみたけどオプションではなさそうだったので Pager#link_to メソッドを上書きして対応してみた。


app.rb

...

module DataMapper
  class Pager
    def link_to page, contents = nil
      if current_page == page
        page
      else
        %(<a href="#{uri_for(page)}">#{contents || page}</a>)
      end
    end
  end
end

...





おしまい