Following on from this post - Pow - utilise existing code to prevent change of email address?
I’m not sure if this is because I have a custom controller, or I have user_id_field
set to something other than :email
- but when the user is registered for the first time, it appears that :unconfirmed_email
isn’t set. If I edit the user and change the email address, then it is.
This is the default changeset:
def changeset( user_or_changeset, attrs ) do
user_or_changeset
|> cast(attrs, [:email])
|> pow_changeset(attrs)
|> pow_extension_changeset(attrs)
end
And here’s the create part in my RegistrationController
:
defmodule ZoinksWeb.RegistrationController do
use ZoinksWeb, :controller
def new(conn, _params) do
changeset = Pow.Plug.change_user(conn)
render(conn, "new.html", changeset: changeset)
end
def create(conn, %{"user" => user_params}) do
conn
|> Pow.Plug.create_user(user_params)
|> case do
{:ok, user, conn} ->
if user.email do
conn
|> send_confirmation_email( user )
|> Zoinks.Pow.recreate_session( user )
|> redirect( to: Routes.registration_path(conn, :almost) )
else
conn
|> Zoinks.Pow.recreate_session( user )
|> put_flash(:info, "Welcome!")
|> redirect(to: Routes.log_path(conn, :index))
end
{:error, changeset, conn} ->
render(conn, "new.html", changeset: changeset)
end
end
def send_confirmation_email(conn, user) do
if user && user.email && !user.email_confirmed_at do
url = Routes.registration_url( conn, :confirmed, user.email_confirmation_token )
email = PowEmailConfirmation.Phoenix.Mailer.email_confirmation( conn, user, url )
Pow.Phoenix.Mailer.deliver(conn, email)
IO.puts "Pop goes the email!"
end
conn
end
end
Looking at maybe_set_unconfirmed_email
- it’s expecting state
to be :loaded
. However, in my code state
is :built
When I edit the user, everything works fine. Did I miss something when creating the user?