Kaminariを使うための最低限の準備
Railsアプリケーションの準備ができたら、Kaminariによるページネーションの動作を確認することができる最低限の準備を以下の通り行います。
- ScaffoldによるArticleモデル等の作成
- 動作確認用のデータ準備
- Kaminari用のコード修正
ScaffoldによるArticleモデル等の作成
ページネーションの動作確認のために、ここではタイトル(title)と本文(body)をフィールドに持つ記事(Article)モデルを作成します。ページネーションの動作確認にはRailsが提供するScaffoldの一覧(indexアクション)があれば十分なので、以下のコマンドでArticleモデル等を作成しましょう。
bin/rails g scaffold Article title:string body:text
実行するとコントローラー、モデル、ビュー、マイグレーションファイル等が作成されます。
作確認用のデータ準備
まずは事前準備として、データベース/テーブルの作成を以下のコマンドで行います。
bin/rails db:create db:migrate
上記の通り、データベースの作成とテーブルの作成を一度に行うこともできます。
次に、ページネーションの動作確認のためには多数のレコードを事前に作成する必要があります。ここでは、Railsが提供するフィクスチャ(Fixtures)を使ってarticlesテーブルにサンプルデータを入れます。
以下のようにフィクスチャファイルを修正します。
<% 30.times do |n| %>
article<%= n %>:
title: <%= "title#{n}" %>
body: <%= "body#{n}" %>
<% end %>
上記の通り、RailsのフィクスチャファイルのYAMLは、ERB形式で記述することができます。ここでは、titleとbodyの値が異なる20件のサンプルデータを入れるよう定義しています。
フィクスチャに定義したサンプルデータをarticlesテーブルに取り込むために、以下のコマンドを実行します。
bin/rails db:fixtures:load
上記コマンドを実行しても、標準出力には何も表示されません。ちゃんとデータが取り込まれたかを確認するには、ログ(log/development.log)を確認するか、railsコンソールで件数を確認しておきます。
以下はrailsコンソールでの確認結果です。
bin/rails c
▼
Loading development environment (Rails 5.2.0) irb(main):001:0> Article.count (8.7ms) SELECT COUNT(*) FROM "articles" => 30
ここまででまずはRailsアプリケーションの動作確認をしておきましょう。以下のコマンドでpumaサーバーを起動します。
bin/rails s
「http://localhost:3000/articles」にアクセスすると以下の通り表示されます。
Kaminari用のコード修正
これでKaminariが提供するページネーションの機能を動作確認する下準備が整いました。ここからはKaminariの動作定義を行っていきます。
まずはgemをインストールするために、GemfileにKaminariを追記します。
…(中略)… gem 'bootsnap', '>= 1.1.0', require: false gem 'kaminari' group :development, :test do …(中略)…
以下のコマンドを実行し、Kaminariをインストールします。
bin/bundle
コントローラーのindexアクションの記述を以下のように修正します。
def index
@articles = Article.page params[:page]
end
pageメソッドは、Kaminariが提供するメソッドで、pageというGETパラメーターにセットされた値(params[:page])を引数に取ります。指定されたページに該当するデータを取得します。なお、params[:page]が指定されない場合はデフォルトで1が指定されます。つまり1ページ目を取得します。
内部的には、SELECT文のLIMIT/OFFSETの指定を1ページあたりの表示件数を指定されたページごとに変えてくれています。なお、Kaminariの「1ページあたりの表示件数」のデフォルト値は「25」です。
この時点でpumaサーバーをCtrl+Cでいったん停止し、再度rails sコマンドで起動して再度一覧の「http://localhost:3000/articles」にアクセスすると以下のように25件表示されていることがわかります。
この時点で既にページネーションの基本的な動作が実現できていることをさらに確認するために、2ページ目を意味するpageパラメーターを付与した「http://localhost:3000/articles?page=2」にアクセスすると、残りの5件が表示されることが確認できます。
ログファイルを確認すると1ページ目にアクセスした場合のSELECT文と2ページ目にアクセスした場合のSELECT文は以下のようにLIMITに1ページあたりの表示件数である25がセットされ、OFFSETがページに即した値になっています。
# 1ページ目にアクセスした場合のSELECT文 Article Load (0.3ms) SELECT "articles".* FROM "articles" LIMIT $1 OFFSET $2 [["LIMIT", 25], ["OFFSET", 0]] # 2ページ目にアクセスした場合のSELECT文 Article Load (0.4ms) SELECT "articles".* FROM "articles" LIMIT $1 OFFSET $2 [["LIMIT", 25], ["OFFSET", 25]]
次に、ビューファイルにページ送りのリンクを設置します。
…(中略)… </table> <%= paginate @articles %> <br> …(中略)…
paginateは、Kaminariが提供するヘルパーメソッドです。コントローラーでpageメソッドを使用して代入したインスタンス変数(@articles)を引数に指定しています。たったこれだけで、ページ送りの基本的なHTMLを動的に出力してくれます。
表示を確認するために再度「http://localhost:3000/articles」にアクセスすると以下のようにページ送り用の表示が追加されています。
同様に、2ページ目のページ送りが正しく動作するかも確認しておきましょう。2ページ目にアクセスすると以下の通り表示されます。
