🐯
【RubyonRails】kaminariを使ってページネーションを使う方法
はじめに
RubyonRailsでページネーションを実装するまでのチュートリアルを共有します。
具体的には、以下のような内容で進めます。
- kaminariのインストール
- kaminariの基本設定
- 並び順の設定
- Viewの設定
0. 完成イメージ
ページネーションを使って、「新しい順」「古い順」「辛い順」「辛くない順」に並び替えができるようにしました。
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