Go to blue arrow
back to Tech Blog
Développement

Written by:

Chris Seelus
Chris Seelus

,

Développeur

Last Published:

2 janvier 2023

•

Min Read

Ruby on Rails : paginez des onglets avec état avec Pagy

Pages de livre ouvertes illuminées devant un bokeh circulaire brillant—paginer des apps Ruby on Rails avec Pagy

Dans un article récent sur le blog d'Imaginary Cloud, Tiago a parlé de Pagy, le nouveau venu ultra-performant en matière de pagination pour Rails (ou tout autre framework Ruby basé sur Rack).

Customized-Pagy-Navigation-Examples

Ce suivi est un guide pratique utilisant l'extension intégrée compact , qui propose un nouveau type d'interface utilisateur via le helper pagy_nav_bootstrap_compact , en l'adaptant légèrement à nos besoins.

Je vais utiliser une petite application exemple avec des données de test générées par la gem Faker pour démontrer les capacités de Pagy. Vous pouvez voir ce que nous allons construire et inspecter le code sur GitHub.

Outre le helper frontend par défaut pagy_nav, qui génère une pagination très basique, il en existe deux autres (compact, bootstrap), donc si vous souhaitez utiliser un autre type de pagination ou vous passer de Bootstrap, c'est tout à fait possible.

blue arrow to the left
Imaginary Cloud logo

Installation

Commencez par ajouter Pagy à votre Gemfile, puis exécutez bundle install:

gem 'pagy', '~> 0.8.1'

Ajoutez les données de l'application à la base de données :

rake db:seed

Créez l'initialiseur pagy.rb pour l'application :

# load the compact UI extra require 'pagy/extras/compact' # set the default items per page Pagy::VARS[:items] = 10

Incluez le backend Pagy dans un contrôleur pour le rendre disponible localement, ou dans ApplicationController pour le rendre disponible globalement :

include Pagy::Backend

Vous êtes maintenant prêt à paginer vos collections ActiveRecord dans les contrôleurs qui incluent le backend Pagy, ce qui correspond à tous les contrôleurs héritant de votre ApplicationController si vous l'y avez inclus. Supposons que vous ayez une action index affichant des nébuleuses que vous souhaitez paginer, vous pouvez procéder comme suit :

@pagy, @nebulae = pagy(Nebula.all)

Incluez le frontend dans un helper ou dans ApplicationHelper pour le rendre disponible globalement :

include Pagy::Frontend

Pour afficher votre pagination, vous pouvez désormais utiliser l'un des helpers frontend de Pagy, comme ceci :

<%== pagy_nav_bootstrap_compact @pagy %>

Personnalisation de la pagination

Par défaut, pagy_nav_bootstrap_compact affichera quelque chose comme ceci :

Blue pagination bar showing Page 20 of 40 with Prev and Next buttons for Pagy in Ruby on Rails apps.

Vous pouvez adapter les libellés textuels si vous require 'pagy/extra/i18n' dans un initialiseur, copiez le dictionnaire Pagy standard dans votre dossier config/locales et modifiez ou traduisez les libellés comme bon vous semble.

Via l'initialiseur, vous pouvez également définir des options telles que le nombre d'éléments par page et bien plus encore.

Pour adapter le style, nous pouvons utiliser un peu de SASS :

.pagy-nav-bootstrap-compact @extend .justify-content-center position: relative margin: 60px 0 40px .prev, .next, .pagy-compact-input @extend .btn-outline-dark .prev, .next, font-family: FontAwesome font-size: 1.25rem line-height: 1.3rem padding-right: 1rem padding-left: 1rem &.disabled color: $gray-light .pagy-compact-input color: $body-color !important opacity: 1 background: transparent !important input @extend .form-control display: inline font-weight: bold width: auto !important background: transparent

Cela va @extend le style btn-outline-dark de Bootstrap, remplacer le texte des boutons précédent/suivant par des icônes de flèches et styliser le champ input.

blue arrow to the left
Imaginary Cloud logo

Paginer plusieurs collections simultanément

Il est parfois nécessaire de paginer plusieurs collections pour une même action de contrôleur.

Dans l'exemple suivant, je vais afficher deux collections, Étoiles et Nébuleuses, sur une seule page à l'aide de deux onglets Bootstrap.

Avec Pagy, il est facile de paginer et de naviguer dans chacune d'elles séparément.

Dans l'action du contrôleur où je définis les collections Pagy, il suffit d'ajouter un page_param avec le symbole de mon choix à chaque collection :

@pagy_stars, @stars = pagy(Star.all, page_param: :page_stars) @pagy_nebulae, @nebulae = pagy(Nebula.all, page_param: :page_nebulae)

Désormais, Pagy ajoutera automatiquement ce paramètre aux liens de navigation et l'extraira de l'URL lors du rendu de la vue. C'est extrêmement simple et pratique !

blue arrow to the left
Imaginary Cloud logo

Maintenir l'état

Pour maintenir également l'état de l'onglet actif, nous pouvons utiliser l'option de Pagy permettant d'ajouter des paramètres arbitraires :

@pagy_stars, @stars = pagy(Star.all, page_param: :page_stars, params: { active_tab: 'stars' })
@pagy_nebulae, @nebulae = pagy(Nebula.all, page_param: :page_nebulae, params: { active_tab: 'nebulae' })

Ce paramètre peut être utilisé pour les onglets Bootstrap .nav-links et .tab-pane en définissant leur état actif avec une condition :

<ul class="nav nav-tabs" role="tablist">
 <li class="nav-item" role="presentation">
   <a class="nav-link <%= 'active' unless params[:active_tab] == 'nebulae' %>" data-toggle="tab" href="#stars">
     Étoiles
   </a>
 </li>
 <li>
   <a class="nav-link <%= 'active' if params[:active_tab] == 'nebulae' %>" data-toggle="tab" href="#nebulae">
     Nébuleuses
   </a>
 </li>
</ul>

<div class="tab-content">
 <div class="tab-pane <%= 'active' unless params[:active_tab] == 'nebulae' %>" id="stars">
 …
</div>

Nous pouvons désormais non seulement créer des liens vers des pages spécifiques pour chaque onglet, mais aussi conserver l'onglet ouvert même lorsque les visiteurs copient et collent des liens vers notre site. Pratique !

blue arrow to the left
Imaginary Cloud logo

Conclusion

Comme j'espère que cet article vous aidera à le souligner, Pagy n'est pas seulement très performant (voir post précédent à propos de Pagy) mais également très confortable à utiliser et facile à personnaliser.

Des choses comme renommer le paramètre de page sont à mon avis encore plus simples à faire avec Pagy qu'avec will_paginate ou Kaminari.

Le temps nous dira si Pagy deviendra le joyau incontournable de Rails en matière de pagination, je pense certainement qu'il a le potentiel de le devenir.

À Imaginary Cloud nous travaillons avec un large éventail de technologies, y compris Ruby on Rails. Si vous avez besoin d'aide avec cette technologie ou des technologies similaires dans le cadre de votre projet de développement logiciel, nous avons une équipe d'experts qui vous attend ! Envoyez-nous un message ici!

Publicité pour un audit UX listant les bénéfices pour l'expérience utilisateur, avec des interfaces 3D.

Vous avez trouvé cet article utile ? Ceux-ci vous plairont peut-être aussi !

blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
Chris Seelus
Chris Seelus

Un entrepreneur de Bavière qui travaille actuellement sur un logiciel basé sur des applications Web et mobiles pour la gestion de la qualité. J'aime beaucoup Ruby on Rails et React Native.

‍

LinkedIn

Read more posts by this author

People who read this post, also found these interesting:

Dropdown caret icon