thousandsofthem

thousandsofthem

Add_error for embedded changeset

How exactly i can add an error into nested/embedded changeset? Don’t think add_error can do this.
Context: regular changeset validation already happened and i’m doing some external check
e.g.

...
defmodule Thing do
  schema "things" do
    embeds_one :config, ThingConfig, on_replace: :update
  end
end
...
defmodule ThingConfig do
  @primary_key false
  embedded_schema do
    field :param, :string
  end
end
# ??
ch1 = Ecto.Changeset.add_error(ch.changes.config, :param, "error")
# ??????
Ecto.Changeset.put_embed(ch, :config, ch1)

on insert it works, on update - error:

Since you have set :on_replace to :update, you are only allowed
to update the existing entry by giving updated fields as a map or
keyword list or set it to nil.

Marked As Solved

LostKobrakai

LostKobrakai

update_in(ch.changes.config, fn changeset -> 
  Ecto.Changeset.add_error(changeset, :param, "error")
end)

Just be aware that this won’t make the parent become valid?: false.

Last Post!

silverdr

silverdr

I see, TNX. BTW, that’s what I am doing right now but was hoping that there might be something I am not aware of that would do this for me.

My case is that I embed_many and all of them in their own context are valid, but the parent needs to check whether all embedded ones are unique (in some way) and mark those, which are not. So I traverse the embedded ones and add_error/4 to non-unique ones. It is used in conjunction with on_replace: :delete so not so much need for taking care of “unsafe-ness” of this uniqueness check, I reckon.

But maybe there’s a better approach to this problem in general?

UPDATE:

		new_embedded_changesets = Enum.map(changeset.changes.my_embed_many, fn embedded_changeset ->
			if !Enum.empty?(embedded_changeset.changes) && Enum.member?(duplicates, embedded_changeset.changes[field]), do: add_error(embedded_changeset, field, "has to be unique"), else: embedded_changeset
		end)
		# This (update_change/3) seems to do the trick so far
		update_change(changeset, :tax_rates, fn _original_embedded_changesets -> new_embedded_changesets end)

where duplicates are found earlier, of course

Where Next?

Popular in Questions Top

nobody
Hi! In PHP: $_SERVER[‘SERVER_ADDR’] - in Elixir? Searched the docs for ip address and the web, no good results. Thanks!
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
lanycrost
Hi everyone! I need implement if…else if…else condition from my elixir code, and anymore of this control flow structures not work proper...
New
dokuzbir
I want to highlight html closing tags when i click a html tag. That works in .html files but doesnt work for html.eex templates. How can...
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
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New

Other popular topics Top

minhajuddin
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
hariharasudhan94
I would like to know what is the best IDE for elixir development?
New
sen
Hi All, I set a environment variables in dev.exs , like below code. when i start server, how can i set the ${enable} value? thanks. d...
New
sorentwo
Hello! tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability. After spen...
985 44532 311
New
shijith.k
I am trying to start a new phoenix project with elixir 1.9, but mix phx.new does not work. It says that ** (Mix) The task "phx.new" could...
New
msaraiva
Surface is an experimental library built on top of Phoenix LiveView and its new LiveComponent API that aims to provide a more declarative...
564 44139 214
New

We're in Beta

About us Mission Statement