I’m getting started with LiveView Upload by following Chris McCord’s Video ( https://youtu.be/PffpT2eslH8?t=795 ) and I have some trouble with updating an entity with a new Image.
In the Video, in the :edit
Action of the LiveView, he’s doing it like this:
post = put_photo_urls(socket, socket.assigns.post)
Timeline.update_post(post, post_params)
The update_post
function in the context looks like this:
def update_post(%Post{} = post, attrs) do
post
|> Post.changeset(attrs)
|> Repo.update()
end
In the Schema he adds the :photo_urls
field, but does not add it to the changeset function and says “we’ll set it directly”.
The Problem is, if I try this in my own app with a very similar structure (I just have one image_url
instead of multiple photo_urls
and my model is called Character with some other fields as well), the image_url
does not get updated…
If I try by hand and change the image_url
of an existing Character
c = Characters.get_character!(1) |> Map.put(:image_url, "some_image_url")
And then pipe it through the Changeset with an empty dictionary (note, just like in the Video, my changeset function does not include image_url)
c |> Character.changeset(%{})
I get an empty changeset back, and then piping the result into Repo.update()
does not cause a Database Query.
Interestingly though, the return value of Repo.update
is the character WITH image_url
set…
On the other hand, it works when creating a new character and that uses the same approach (basically %Character{image_url: "some_url"} |> Character.changeset(attrs) |> Repo.insert()
)