View Source Inertia.Controller (Inertia v0.10.0)
Controller functions for rendering Inertia.js responses.
Summary
Functions
Assigns errors to the Inertia page data. This helper accepts an
Ecto.Changeset
(and automatically serializes its errors into a shape
compatible with Inertia), or a bare map of errors.
Assigns a prop value to the Inertia page data.
Marks a prop value as "always included", which means it will be included in the props on initial page load and subsequent partial loads (even when it's not explicitly requested).
Marks a prop value as lazy, which means it will only get evaluated if explicitly requested in a partial reload.
Renders an Inertia response.
Types
Functions
@spec assign_errors(Plug.Conn.t(), data :: Ecto.Changeset.t() | map()) :: Plug.Conn.t()
Assigns errors to the Inertia page data. This helper accepts an
Ecto.Changeset
(and automatically serializes its errors into a shape
compatible with Inertia), or a bare map of errors.
If you are serializing your own errors, they should take the following shape:
%{
"name" => "Name is required",
"password" => "Password must be at least 5 characters",
"team.name" => "Team name is required",
}
When assigning a changeset, you may optionally pass a message-generating function
to use when traversing errors. See Ecto.Changeset.traverse_errors/2
for more information about the message function.
defp default_msg_func({msg, opts}) do
Enum.reduce(opts, msg, fn {key, value}, acc ->
String.replace(acc, "%{#{key}}", fn _ -> to_string(value) end)
end)
end
This default implementation performs a simple string replacement for error
message containing variables, like count
. For example, given the following
error:
{"should be at least %{count} characters", [count: 3, validation: :length, min: 3]}
The generated description would be "should be at least 3 characters". If you would
prefer to use the Gettext
module for pluralizing and localizing error messages, you
can override the message function:
conn
|> assign_errors(changeset, fn {msg, opts} ->
if count = opts[:count] do
Gettext.dngettext(MyAppWeb.Gettext, "errors", msg, msg, count, opts)
else
Gettext.dgettext(MyAppWeb.Gettext, "errors", msg, opts)
end
end)
@spec assign_errors(Plug.Conn.t(), data :: Ecto.Changeset.t(), msg_func :: function()) :: Plug.Conn.t()
@spec assign_prop(Plug.Conn.t(), atom(), any()) :: Plug.Conn.t()
Assigns a prop value to the Inertia page data.
Marks a prop value as "always included", which means it will be included in the props on initial page load and subsequent partial loads (even when it's not explicitly requested).
Marks a prop value as lazy, which means it will only get evaluated if explicitly requested in a partial reload.
Lazy props will only be included the when explicitly requested in a partial reload. If you want to include the prop on first visit, you'll want to use a bare anonymous function or named function reference instead.
conn
# ALWAYS included on first visit...
# OPTIONALLY included on partial reloads...
# ALWAYS evaluated...
|> assign_prop(:cheap_thing, cheap_thing())
# ALWAYS included on first visit...
# OPTIONALLY included on partial reloads...
# ONLY evaluated when needed...
|> assign_prop(:expensive_thing, fn -> calculate_thing() end)
|> assign_prop(:another_expensive_thing, &calculate_another_thing/0)
# NEVER included on first visit...
# OPTIONALLY included on partial reloads...
# ONLY evaluated when needed...
|> assign_prop(:super_expensive_thing, inertia_lazy(fn -> calculate_thing() end))
@spec render_inertia(Plug.Conn.t(), component :: String.t(), props :: map()) :: Plug.Conn.t()
Renders an Inertia response.