Flash Messages
Documentation / Flash Messages / Macros flash

Macros flash

Macros de redirection

Ces macros stockent les messages en session via request.notices. Ils s'affichent après la prochaine redirection (pattern Post/Redirect/Get).

success!

success!(request.notices => "Utilisateur créé avec succès !");
success!(request.notices => format!("Bienvenue {} !", username));

// Plusieurs messages en une fois
success!(request.notices => "Créé", "Email envoyé", "Bienvenue !");

error!

error!(request.notices => "Une erreur s'est produite");
error!(request.notices => format!("Erreur : {}", e));

info!

info!(request.notices => "Veuillez vérifier votre email");

warning!

warning!(request.notices => "Cette action ne peut pas être annulée");

Chaque macro appelle .success(), .error(), .info() ou .warning() sur request.notices (de type Message).


Macro flash_now! — Messages immédiats

flash_now! crée un Vec<FlashMessage> pour affichage immédiat dans la requête courante. Idéal pour les cas où il n'y a pas de redirection (par exemple, ré-affichage du formulaire après une erreur de validation).

// Un seul message
let msgs = flash_now!(error => "Veuillez corriger les erreurs");

// Plusieurs messages
let msgs = flash_now!(warning => "Champ A incorrect", "Champ B manquant");

Types disponibles

TypeMessageLevel::as_css_class()
successmessage-success
errormessage-error
infomessage-info
warningmessage-warning

as_css_class() renvoie la même classe que le tag intégré {% messages %}, dont le template émet class="message message-{{ message.level }}" : message.level se sérialise en minuscules (success, error, info, warning). Voir Templates flash pour boucler manuellement.

Injection dans le contexte

flash_now! retourne un vecteur à injecter manuellement dans le contexte :

context_update!(request => {
    "title" => "Erreur de validation",
    "form" => &form,
    "messages" => flash_now!(error => "Veuillez corriger les erreurs"),
});

Limite actuelle : les macros de redirection ignorent un échec d'écriture en session. Si la session ne peut pas être enregistrée (base indisponible avec le store en base), le message est perdu sans erreur. L'action elle-même n'est pas affectée.


Différence flash vs flash_now

success! / error! / etc.flash_now!
StockageSessionMémoire (Vec)
AffichageAprès redirectRequête courante
Durée de vieJusqu'à la prochaine lectureRequête unique
Usage typiquePost/Redirect/GetRé-affichage formulaire
Injection contexteAutomatiqueManuelle ("messages" => flash_now!(...))

Quand utiliser quoi ?

Utilisez les macros flash (session)

// Après une action réussie avec redirection
success!(request.notices => "Sauvegardé !");
return Ok(Redirect::to("/").into_response());

Utilisez flash_now! (immédiat)

// Erreur de validation → ré-afficher la page sans redirect
context_update!(request => {
    "form" => &form,
    "messages" => flash_now!(error => "Formulaire invalide"),
});
return request.render("form.html");