Flash Messages

Flash Macros

Redirect Macros

These macros store messages in the session via request.notices. They are displayed after the next redirect (Post/Redirect/Get pattern).

success!

success!(request.notices => "User created successfully!");
success!(request.notices => format!("Welcome {}!", username));

// Multiple messages at once
success!(request.notices => "Created", "Email sent", "Welcome!");

error!

error!(request.notices => "An error occurred");
error!(request.notices => format!("Error: {}", e));

info!

info!(request.notices => "Please check your email");

warning!

warning!(request.notices => "This action cannot be undone");

Each macro calls .success(), .error(), .info(), or .warning() on request.notices (of type Message).


flash_now! Macro — Immediate Messages

flash_now! creates a Vec<FlashMessage> for immediate display in the current request. Ideal when there is no redirect (for example, re-rendering a form after validation errors).

// Single message
let msgs = flash_now!(error => "Please fix the errors");

// Multiple messages
let msgs = flash_now!(warning => "Field A is incorrect", "Field B is missing");

Available Types

TypeGenerated CSS Class
successmessage-success
errormessage-error
infomessage-info
warningmessage-warning

Injecting into the context

flash_now! returns a vector that must be manually injected into the context:

context_update!(request => {
    "title" => "Validation error",
    "form" => &form,
    "messages" => flash_now!(error => "Please fix the errors"),
});

Difference: Flash vs Flash Now

success! / error! / etc.flash_now!
StorageSessionMemory (Vec)
DisplayAfter redirectCurrent request
LifetimeUntil next readSingle request
Typical usePost/Redirect/GetRe-render form
Context injectionAutomaticManual ("messages" => flash_now!(...))

When to Use Which?

Use flash macros (session)

// After a successful action with redirect
success!(request.notices => "Saved!");
return Ok(Redirect::to("/").into_response());

Use flash_now! (immediate)

// Validation error → re-render page without redirect
context_update!(request => {
    "form" => &form,
    "messages" => flash_now!(error => "Invalid form"),
});
return request.render("form.html");