I use this controller to setup a new registration form:
defmodule AniminaWeb.AccountsController do
use AniminaWeb, :controller
alias Animina.Accounts
alias Animina.Accounts.User
alias AshPhoenix.Form
def register(conn, _params) do
conn =
conn
|> assign(:form_id, "sign-up-form")
|> assign(:cta, "Account anlegen")
|> assign(:action, ~p"/auth/user/password/register")
|> assign(:is_register?, true)
|> assign(
:form,
Form.for_create(User, :register_with_password, api: Accounts, as: "user")
)
render(conn, :register, layout: false)
end
end
It renders this template:
<.top_navigation />
<div class="py-6 space-y-10 px-5">
<div class="flex min-h-full flex-col justify-center px-6 py-12 lg:px-8">
<div class="mt-10 sm:mx-auto sm:w-full sm:max-w-sm">
<ul class="error-messages">
<%= if @form.errors do %>
<%= for {k, v} <- @errors do %>
<li>
<%= humanize("#{k} #{v}") %>
</li>
<% end %>
<% end %>
</ul>
<.form :let={f} for={@form} action={@action} method="POST" class="space-y-6">
<%= if @is_register? do %>
<div>
<label for="username" class="block text-sm font-medium leading-6 text-gray-900">
Username
</label>
<div class="mt-2">
<%= text_input(f, :username,
class:
"block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6",
placeholder: "Pusteblume1977",
type: :text,
required: true,
autofocus: true
) %>
</div>
</div>
<% end %>
<div>
<label for="email" class="block text-sm font-medium leading-6 text-gray-900">
E-Mail Addresse
</label>
<div class="mt-2">
<%= text_input(f, :email,
class:
"block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6",
placeholder: "eddie@beispiel.de",
type: :email,
required: true
) %>
</div>
</div>
<div>
<div class="flex items-center justify-between">
<label for="password" class="block text-sm font-medium leading-6 text-gray-900">
Passwort
</label>
<%= unless @is_register? do %>
<div class="text-sm">
<a href="#" class="font-semibold text-indigo-600 hover:text-indigo-500">
Passwort vergessen?
</a>
</div>
<% end %>
</div>
<div class="mt-2">
<%= password_input(f, :password,
class:
"block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6",
placeholder: "Passwort"
) %>
</div>
</div>
<div>
<%= submit(@cta,
class:
"flex w-full justify-center rounded-md bg-indigo-600 px-3 py-1.5 text-sm font-semibold leading-6 text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
) %>
</div>
</.form>
</div>
</div>
</div>
Any validation error leads to a call of this function in AuthController
:
def failure(conn, _activity, _reason) do
conn
|> put_status(401)
|> render("failure.html")
end
But I’d like to go back to the original create form and display it with all the values and the validation errors. Do I have to code this in the failure/3
function or is there an AshAuthentication switch which I can use for this?