tokumei v0.5.0 Tokumei.Flash.Query
Store flash messages as part of a url’s query.
See Tokumei.Flash
for documentation on reading and writing flash messages.
Tokumei.Flash.Query
can be added as a middleware.
defmodule MyApp do
use Elixir.Tokumei.Flash.Query
end
Inbound messages will automatically be extracted from request queries. Outbound messages will be embedded in the response location.
N.B. A location header must be on a response to embed flash messages.
Summary
Functions
Embed messages within a redirection query
Extract all query transfered flash messages from a request
Functions
Embed messages within a redirection query
Examples
# Flash message will be embedded in query
iex> {:ok, %{query: query}} = Response.see_other()
...> |> Raxx.Location.set("/")
...> |> Flash.Query.embed(warning: "Hold it")
...> |> Raxx.Location.fetch()
...> query
"_flash%5B%5D=warning%3AHold+it"
iex> {:ok, %{query: query}} = Response.see_other()
...> |> Raxx.Location.set("/")
...> |> Flash.Query.embed(warning: "Hold it", info: "It's Sunday")
...> |> Raxx.Location.fetch()
...> query
"_flash%5B%5D=warning%3AHold+it&_flash%5B%5D=info%3AIt%27s+Sunday"
# Flash messages can be embedded under custom key
iex> {:ok, %{query: query}} = Response.see_other()
...> |> Raxx.Location.set("/")
...> |> Flash.Query.embed([warning: "Hold it"], key: "_notices")
...> |> Raxx.Location.fetch()
...> query
"_notices%5B%5D=warning%3AHold+it"
# Flash messages are dropped if embed is silent and no location is provided.
iex> response = Response.see_other()
...> response == Flash.Query.embed(response, [warning: "Hold it"], silent: true)
true
# Flash messages are dropped if embed is silent and no location is provided.
iex> response = Response.see_other()
...> try do
...> Flash.Query.embed(response, [warning: "Hold it"])
...> rescue
...> e -> e
...> end
%Flash.Query.NoLocationError{}
Extract all query transfered flash messages from a request
Examples
# Flash messages are extracted from query
iex> Request.get("/?_flash[]=danger%3ABad+times&_flash[]=success%3AHooray")
...> |> Flash.Query.extract()
...> |> elem(0)
[danger: "Bad times", success: "Hooray"]
# Request is returned with flash removed
iex> Request.get("/?_flash[]=danger%3Amessage+here&foo=bar")
...> |> Flash.Query.extract()
...> |> elem(1)
...> |> Map.get(:query)
%{"foo" => "bar"}
# Single message is returned as a list
iex> Request.get("/?_flash=info%3ABeeTeeDubs")
...> |> Flash.Query.extract()
...> |> elem(0)
[info: "BeeTeeDubs"]
# Empty list is returned if no query
iex> Request.get("/")
...> |> Flash.Query.extract()
...> |> elem(0)
[]
# query parameter to use for flash can be configured
iex> Request.get("/?_notices[]=info%3AOla")
...> |> Flash.Query.extract(key: "_notices")
...> |> elem(0)
[info: "Ola"]