Comment intégrer des notifications en temps réel dans votre application Rails avec Noticed
Enregistrer
1
•Temps de lecture: 6 min•Vues: 227Niveau:Intermédiaire
5 moispar Franci-lobbie LALANE
Tags:
#notification
#noticed
#rails
Dans le développement d’applications web modernes, les notifications jouent un rôle crucial pour informer l’utilisateur en temps réel de nouveaux événements (commentaires, mentions, likes, etc.). Cependant, il arrive que la documentation en français sur ces sujets soit obsolète ou difficile à trouver. Dans cet article, nous allons voir comment intégrer des notifications dans une application Ruby on Rails en utilisant le gem Noticed (version 1.6). Nous verrons, étape par étape, la création d’une nouvelle application, l’installation de Noticed, la configuration des notifications via ActionCable et Turbo Streams, et enfin la mise en place d’un système de notifications en temps réel qui s’actualise sans recharger la page.
1. Création d'une nouvelle application Rails avec Tailwind pour le CSS
rails new captain_ruby_notifications --skip-active-storage --skip-action-mailbox --css=tailwind
cd captain_ruby_notifications
2.Ajout de nos modèles Post et Comment ainsi que de la gem Devise pour la gestion des utilisateurs
Ajoutez Devise au Gemfile (ou utilisez bundle add devise) et installez-le :
bundle add devise
rails generate devise:install
rails generate devise User
Ensuite, générez les scaffolds pour Post et Comment :
Nous allons retouver notre fichier qui été généré dans : app/notifications/comment_notification.rb
Modifiez-le comme suit :
class CommentNotification < Noticed::Base
deliver_by :database
deliver_by :action_cable, format: :to_action_cable
# On attend un paramètre :message (chaîne de caractères)
param :message
# Après la livraison, nous diffusons la notification via Turbo Streams
after_deliver :broadcast_notification
def to_database
{ message: params[:message] }
end
def to_action_cable
{ title: "Nouveau commentaire", message: params[:message], id: record.id }
end
private
def broadcast_notification
recipient.broadcast_prepend_later_to(
"notifications_#{recipient.id}_dropdown_list",
target: "notification-dropdown-list",
partial: "notifications/notification",
locals: { notification: self.record }
)
recipient.broadcast_replace_later_to(
"notifications_#{recipient.id}_counter",
target: "notification-counter",
partial: "notifications/notification_counter",
locals: { user: recipient }
)
end
end
5.Ajustement des modèles
a. Dans app/models/user.rb, ajoutez l’association pour les notifications :
class User < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
has_many :posts, dependent: :destroy
has_many :comments, dependent: :destroy
# Note : le modèle est généré sous le nom Notification
has_many :notifications, as: :recipient, dependent: :destroy, class_name: "Notification"
end
b. Dans app/models/comment.rb, ajoutez le callback pour déclencher la notification :
class Comment < ApplicationRecord
belongs_to :post
belongs_to :user
validates :content, presence: true
# Après création, déclencher la notification (sauf si l'auteur commente son propre article)
after_create_commit :notify_post_user
private
def notify_post_user
return if post.user == user
CommentNotification.with(
message: "#{user.email} à commenté votre article : #{post.title}"
).deliver_later(post.user)
end
end
6. Une fois les modèles définis, nous allons maintenant mettre à jour le contrôleur des commentaires (CommentController.rb)
Voici un exemple mis à jour pour app/controllers/comments_controller.rb qui gère le streaming via Turbo Streams :
Puis créer un fichier Turbo Stream pour la méthode "create".
code app/views/comments/create.turbo_stream.erb
7. Mise en place des vues pour les notifications
a. Créez le fichier app/views/notifications/_notification.html.erb, qui sera le corps de nos notifications :
e. Ouvrez votre fichier app/views/layouts/application.html.erb et insérez-y le rendu du partial de la navbar. Par exemple, juste après l'ouverture de la balise <body> :
8. Dans app/controllers/application_controller.rb, ajoutez un before_action pour charger les notifications globalement dans l'environement si l'utilisateur est connecté :
9. Vérification et tests
Démarrez le serveur avec :
bin/dev
Accédez à votre application dans le navigateur avec l'url : http://localhost:3000. Vous devriez voir la navbar en haut de la page avec les liens, l’icône de notification, le compteur et la liste déroulante. Les notifications se diffuseront en temps réel via Turbo Streams lorsque de nouveaux commentaires seront créés.
🎉Et voilà, vous êtes désormais prêts à créer des notifications en temps réel avec Rails