Wojciech

Wojciech

"I have recently generated authorization using phx.gen and attempted to add an additional field to the table. Subsequently, I implemented a method to update this new field. Then I updated the registration form and added a new form to the settings page. Currently, all functionalities are working as expected, except for the part that allows updating the name.

When i submit form “name_form” i don’t get any errors, but when i look up the database data doesn’t seem to change, i tried using IO.inspect() (probably) everywhere and everything still seems fine.

Form:

    <div>
      <.simple_form
        for={@name_form}
          id="name_form"
          phx-submit="update_name"
          phx-change="validate_name"
        >
          <.input field={@name_form[:name]} type="text" label="Username" autocomplete="off" required />
          <:actions>
            <.button phx-disable-with="Changing...">Change username</.button>
          </:actions>
        </.simple_form>
      </div>

I have two event handlers, one for validation and the other for updating:

   def handle_event("validate_name", %{"user" => user_params}, socket) do
    name_form =
      socket.assigns.current_user
      |> Accounts.change_user_name(user_params)
      |> Map.put(:action, :validate)
      |> to_form()

    {:noreply, assign(socket, name_form: name_form)}
   end

   def handle_event("update_name", %{"user" => user_params}, socket) do
    user = socket.assigns.current_user

    case Accounts.apply_user_name(user, user_params, [validate_name: true]) do
      {:ok, _changeset} ->
        {:noreply, socket}

      {:error, changeset} ->
        {:noreply, assign(socket, :form, to_form(changeset))}
    end
   end

Accounts module, change_user_name returns an %Ecto.Changeset{} for changing the user name:

  def change_user_name(user, attrs \\ %{}, opts \\ []) do
    User.name_changeset(user, attrs, opts)
  end

  def apply_user_name(user, attrs, opts \\ []) do
    user
    |> User.name_changeset(attrs, opts)
    |> Ecto.Changeset.apply_action(:update)
  end

User module contains validate_name changeset which validates name and checks if name in unique:

  def validate_name(changeset, opts) do
    changeset
    |> validate_required([:name])
    |> validate_length(:name, min: 2, max: 36, message: "username must be between 2 and 36 characters")
    |> validate_format(:name, ~r/^[^\s]*$/, message: "cannot have a space at the end")
    |> maybe_validate_unique_name(opts)
  end

  def name_changeset(user, attrs \\ %{}, opts \\ []) do
    user
    |> cast(attrs, [:name])
    |> validate_name(opts)
    |> case do
      %{changes: %{name: _}} = changeset -> changeset
      %{} = changeset -> add_error(changeset, :name, "did not change")
    end
  end

  defp maybe_validate_unique_name(changeset, opts) do
    if Keyword.get(opts, :validate_name, true) do
      changeset
      |> unsafe_validate_unique(:name, Elixirlore.Repo)
      |> unique_constraint(:name)
    else
      changeset
    end
  end

I’d be very grateful for at least some indication where error may be located, thanks in advance.

Showing Posts 1 to 2

codeanpeace

codeanpeace

Welcome!

Hmm, I don’t see any calls to Ecto.Repo that would actually interact with the database e.g. Repo.update/2 to persist the changeset.

And to clarify, Ecto.Changeset.apply_action(changeset, :update) attempts to add the :update action to the changeset – it does not attempt to update the database itself.

Wojciech

Wojciech OP

Thanks, that solved my problem <3

— All posts loaded —

Where Next? Top

Trending in Questions Top

katta
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
apz
I’m new to elixir and just tried to install the elixirLS extension for VScode(ium) and it is throwing some errors that I would like help ...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews