iv-mexx

iv-mexx

LiveView Image Upload - Update does not work

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() )

Most Liked

mcrumm

mcrumm

Phoenix Core Team

Welcome @iv-mexx!

What happens if you put the new image URL into the changeset instead of into the struct? You can do so with Ecto.Changeset.put_change/3:

c
|> Character.changeset(%{})
|> Ecto.Changeset.put_change(:image_url, "new_image_url")

Last Post!

iv-mexx

iv-mexx

Thanks for your quick reply!

I can kind of get it to work, but in the whole context only ugly and around many corners, and then it would certainly be better to put it into the attrs by hand.

So in the Video, Chris creates a function in the LiveView (I’m again showing my code thats basically copied but with my models)

  defp put_image_url(socket, %Character{} = character) do
    case uploaded_entries(socket, :image) do
    {[], _} ->
      # Image is optional
      character
    {completed, []} ->
      # Character only has 1 image, so only take the first
      [url | _] = for entry <- completed do
        Routes.static_path(socket, "/uploads/#{entry.uuid}.#{ext(entry)}")
      end

      %Character{character | image_url:  url}

    end
  end

And uses that one in both, create and edit:

  defp save_character(socket, :new, character_params) do
    character = put_image_url(socket, %Character{})

    case Characters.create_character(character, character_params, &consume_image(socket, &1)) do
    ...
  defp save_character(socket, :edit, character_params) do
    character = put_image_url(socket, socket.assigns.character)

    case Characters.update_character(character, character_params, &consume_image(socket, &1)) do
    ...

If I do that and use put_change/3 in the Context, it does not change anything. I guess, because the character already has the same image_url set, so it is not a change.

But thats where I can’t wrap my head around, because thats exactly what Chris is doing in the Video…
To be fair, he did not demo editing, so maybe it would not work in his code as well?

Where Next?

Popular in Questions Top

Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New
mcarvalho
What is the difference between System.get_env and Application.get_env? For example, what are best practices to use one versus another.
New
openscript
Hello! Sorry for this astonishing simple question, but I’m really stuck. I try to set up the intellij-elixir plugin, but I don’t know ho...
New
Lily
In templates/appointment/index.html.eex: &lt;%= for appointment &lt;- @appointments do %&gt; &lt;tr&gt; &lt;td&gt;&lt;%= appoi...
New
nsuchy
Hi. I’ve noticed that Windows Powershell has it’s own IEX command and you cannot access Elixir’s IEX due to the conflict. This isn’t a cr...
New
bsollish-terakeet
Credo is smart enough to check for (something like) this: assert length(the_list) == 0 with this response: Checking if an enum is empt...
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
New

Other popular topics Top

vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
grych
Hi folks, Few months ago I have announced the proof-of-concept of the library to manipulate the browsers DOM objects directly from Elixi...
639 54260 488
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
JakeBecker
TL;DR: I’ve just released an implementation of Microsoft’s IDE-independent Language Server Protocol for Elixir. It adds language support ...
1144 55125 245
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
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