inuinu blog(開発用)

BOT @wagagun の開発ノウハウや、IT向け?の雑記ブログです。

【Ruby on Rails7】一覧画面を降順表示(件数切り捨て or ページネーション)

この記事では、Ruby on Rails7の一覧表示を降順に変更し、さらに表示件数を切り捨てる手法と、ページネーションで表示する手法を説明いたします。

やりたいこと(その1:一覧画面を降順表示し、n件で切り捨てたい)

コントローラーを変更する

例えば販売履歴(Sale)を最新から50件表示するようにします。
app/controllers/sales_controller.rbを変更します。

  # GET /sales or /sales.json
  def index
    @sales = Sale.order(id: :desc).limit(50)
  end

これだけです。

やりたいこと(その2:一覧画面を降順表示し、ページ処理を追加したい)

Gemfileに追記しインストール

まずはGemfileにページネーション系のライブラリを追加します。

# ページネーション
gem "kaminari"
gem 'bootstrap5-kaminari-views'

kaminariがページネーション用のgemライブラリになります。
Bootstrapを使用している場合は、それ用のライブラリも追記します。

bundle install

で、kaminariをインストールします。

コントローラーに追記

まず、app/controllers/application_controller.rbに追記します。

KAMINARI_PER = 50

もし、1ページの表示件数を他のページでも共通化したい場合は、app/controllers/application_controller.rbに定数を定義しておくと良いでしょう。

次に、app/controllers/sales_controller.rbを変更します。

  # GET /sales or /sales.json
  def index
    @sales = Sale.all.page(params[:page]).per(KAMINARI_PER).order(id: :desc)
  end

やりたいこと(その1)にあったlimit()は外し、上記を追記します。

ビューに追記

app/views/sales/index.html.hamlに以下を追記します。

%br
= paginate @sales, theme: 'bootstrap-5'

i18n関連ファイルに追記

上記でも実行できますが、ページ下部のボタン群を日本語化したいかと思います。
その場合は、下記を、任意のja.ymlに追記します。

ja:
  views:
    pagination:
      first: '最初'
      last: '最後'
      previous: '前'
      next: '次'
      truncate: '...'

これで実行し、確認します。