Wojciech

Wojciech

I have trouble with simple data update using forms

"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.

Marked As Solved

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.

Where Next?

Popular in Questions Top

siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New
lessless
I believe there are people here who are dealing with CSV files import on the daily basis, and since Excel is a really popular tool there ...
New
johnnyicon
Hi all, I’ve just started learning Elixir and Phoenix Framework, so please pardon my n00bness at this stage. I’m trying to use Postgres...
New
fireproofsocks
Forgive me if this is obvious, but how does one delete a database record WITHOUT selecting it first? Ecto.Repo — Ecto v3.14.0 has exampl...
New
earth10
Hi, I’m just starting to build a side-project with Elixir and Phoenix and doing some basic test with Elixir alone. What strikes me is th...
New
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New
jason.o
In the code below, if the create action is not set to accept “extra_key” as an input, it errors out with a message shown above. Is there ...
New
dotdotdotPaul
Okay, I’m having a heck of a time trying to figure out how to best handle the validation of belongs_to associations in Ecto. I’m sure I’...
New
marick
I had some trouble figuring out how to make many-to-many associations work. Once I got it working, I wrote a blog post. Because I’m a nov...
New
hariharasudhan94
Lets say I have map like this fetching from my database %{"_id" =&gt; #BSON.ObjectId&lt;58eb1a7a9ad169198c3dXXXX&gt;, "email" =&gt; ...
New

Other popular topics Top

New
senggen
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] 15:22:35.803 [error] gen_event {lager_file_backend...
New
AstonJ
Posting this to see if we can make things easier for people to get into Neovim. If you use Neovim and have a favourite distro please let ...
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod – where is this set? Thanks.
New
chrismccord
This release brings a number of exciting features, including integration with the new Phoenix LiveDashboard and Phoenix LiveView. There h...
New
freewebwithme
Using vs code and installed ElixirLS: support and debugger. And I got an error popped up on start up says Failed to run ‘elixir’ comma...
New
saif
Hello everyone, Long time lurker first time poster here. I’ve recently begun working on Elixir full-time again! :raised_hands: It’s been...
New
rms.mrcs
Hi, I need to transform a list of numbers into a map where the keys are the indexes and the values are the original values of the list. ...
New
Qqwy
Update: How to use the Blogs &amp; Podcasts section You can post links to your blog posts or podcasts either in one of the Official Blog...
3271 126479 1222
New
sergio
Kind of like when jquery came out, it was super necessary. Existing drag and drop libraries have a bunch of baggage to support old browse...
New

We're in Beta

About us Mission Statement