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

感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

Railsでページネーションを実現する

<スポンサーリンク>

ページネーションとは、ページ割りという意味の英単語です。
長い文章とか、長い項目を複数のページに分割して、各ページヘのリンクを並べてアクセスしやすくします。

よく、[1][2][3]...みたいに、一覧の下に数字があって、クリックすると次が見れるかと思いますが、それのことをページネーションといいます。


たとえば、このようになっている表を・・・

f:id:sho322:20140503145835j:plain


こんな感じで、ページごとに表示したい。

f:id:sho322:20140503145843j:plainf:id:sho322:20140503145846j:plain
これはどうやったらいいでしょうか?

ControllerとViewにちょっとしたロジックを仕込むだけでできるようになります。

まずは、コントローラーの処理。

friends_controller.rb

  def show
    @page = params[:page].to_i
    if @page == nil
      @page = 0
    end
    @page_num = 5

    @record_count = Friend.where("id > 0").count
    @results = Friend.where("id > 0").order("age DESC")
                        .offset(@page * @page_num).limit(@page_num)

  end

offsetというのは、「何番目"から"取り出すか」を指定するものです。
@pageで何ページ目か、@page_numでページごとの項目の個数なので、
たとえば2ページ目の項目を取り出したいときは

2 * 5 = 10
で10番目からの項目が取り出せます。

でそのあとの、limitというのは「いくつ取り出すか」を指定するメソッドなので、
@page_numを指定することで、5個に限定して取り出すことができます。

つまり、10番目から5個取り出す、といったことができるのです。

Viewはこんな感じです。

show.html.erb

<h1>Friends#show</h1>
<p>Find me in app/views/friends/show.html.erb</p>

<hr/>
<table>
  <tr><th>ID</th><th>NAME</th><th>AGE</th></tr>
  <% @results.each do |result| %>
  	<tr><td><%= result.id %></td><td><%= result.name %></td><td><%= result.age %></td></tr>
  <% end %>
</table>
<% if @page > 0 then %>
<a href="/friends/show?page=<%=@page - 1 %>">[<%=@page %>]</a>
<% end %>
[<%=(@page + 1) %>]
<% if @record_count > (@page + 1) * @page_num %>
<a href="/friends/show?page=<%=@page + 1 %>">[<%=@page + 2 %>]</a>
<% end %>


<参考文献>
HerokuではじめるRailsプログラミング入門