🐯

【RubyonRails】kaminariを使ってページネーションを使う方法

2024/08/12に公開

はじめに

RubyonRailsでページネーションを実装するまでのチュートリアルを共有します。
具体的には、以下のような内容で進めます。

  1. kaminariのインストール
  2. kaminariの基本設定
  3. 並び順の設定
  4. Viewの設定

0. 完成イメージ

ページネーションを使って、「新しい順」「古い順」「辛い順」「辛くない順」に並び替えができるようにしました。
Image from Gyazo

1. kaminariのインストール

Gemfileにkaminariを追加します

gem 'kaminari'

bundle installでインストールを実行します。

docker-compose exec web bundle install

2. kaminariの基本設定

ページネーションしたい部品をpage(params[:page]).per(n)でpageあたりいくつ表示させるか設定します。

app/controllers/foods_controller.rb

def index
    @foods = Food.page(params[:page]).per(6)
end

app/views/foods/index.html.erb

<%= paginate @foods %>

3. 並び順の設定

pageメソッドを指定しているオブジェクトにorderメソッドを追加することで並ぶ順をカスタムすることができます。

  • sort_order = case params[:sort]
    • リクエストに基づいてデータの並び順を決定します。
    • when 'old' 'created_at ASC'
      • 作成日時(created_at)が古い順に表示します。
    • when 'hot' 'spice_level DESC'
      • 辛さレベル(spice_level)が高い順に表示します。
    • when 'mild' 'spice_level ASC'
      • 辛さレベル(spice_level)が低い順に表示します。
    • else 'created_at DESC'
      • デフォルトで作成日時(created_at)が新しい順に表示します。
def index
    @search_params = food_search_params
    @foods = Food.search(@search_params).includes(:food_category, :food_country)

    # 並び順の設定
    sort_order = case params[:sort]
    when 'old'
        'created_at ASC'
    when 'hot'
        'spice_level DESC'
    when 'mild'
        'spice_level ASC'
    else
        'created_at DESC'
    end
    
    @foods = @foods.order(sort_order).page(params[:page]).per(6)
end

4. Viewの設定

カスタムした並び順を反映するためのリンクを生成します。

  • foods_path(sort: 'new')
    • 新しい順にソートするリンクを生成します。
    • sortパラメータにnewを設定してリクエストを送信します。
<%= link_to '新しい順', foods_path(sort: 'new') %>
<%= link_to '古い順', foods_path(sort: 'old') %>
<%= link_to '辛い順', foods_path(sort: 'hot') %>
<%= link_to '辛くない順', foods_path(sort: 'mild') %>

最後に

以上が、RubyonRailsでページネーションを実装するまでのチュートリアルです。

Discussion