zingo

zingo

I’ll try to describe it as simple as possible.

I made a very simple project to play around with while trying to learn Elixir and Phoenlix Liveview. I created Categories and Products with phx.gen.live. A Product has a belongs_to-relationship with Category, and Category a has_many-relationship with Products.

Adding products and assigning category to them works fine. When hitting the save button the index lists all the products:

In my index-template I have the following code to list it as product name (category name).

<%= product.name %> (<%=product.category.name %>)

Hoever when I click edit on an item and change the category and hit save, the process crashes with the following error:

** (KeyError) key :name not found in: #Ecto.Association.NotLoaded<association :category is not loaded>

After the crashing process restarts everything works fine again, showing the correct new category in the index-view. I also get a quick red flash saying “Something went wrong”.

In live/product_live/index.ex I have modified the mount-function:

def mount(_params, _session, socket) do
  {:ok, stream(socket, :products, Products.list_products_test())}
end

And list_produts_test() is defined as:

def list_products_test do
  Repo.all(Product) |> Repo.preload([:category])
end

I guess I get the error because I have changed the category for one product, and when hitting save somehow the preload() is not called until the process crashes and is reloaded. Should I put the preload() somewhere else, will that solve my problem?

Showing Posts 1 to 6

al2o3cr

al2o3cr

Can you show the code that handles the “save” event?

zingo

zingo OP

I have not modified the generated code, which looks like this:

  def handle_info({TestingWeb.ProductLive.FormComponent, {:saved, product}}, socket) do
    {:noreply, stream_insert(socket, :products, product)}
  end

Edit: Or maybe it’s this function:

  def update_product(%Product{} = product, attrs) do
    product
    |> Product.changeset(attrs)
    |> Repo.update()
  end
al2o3cr

al2o3cr

I suspect the best place to change is the code between these two spots - the part that calls update_product and then sends the {:saved, product} message.

You’d want to add a Repo.preload there to ensure that the Product being added to the stream has the needed association loaded.

zingo

zingo OP

I have now modified my code, it works, but my solution seems a bit sketchy.

First i created a modified version of the generated get_product():

The original:

def get_product!(id), do: Repo.get!(Product, id)

My modified version:

def get_product_2!(id), do: Repo.get!(Product, id) |> Repo.preload([:category])

Then I modified handle_info():

  def handle_info({TestingWeb.ProductLive.FormComponent, {:saved, product}}, socket) do
    product = Products.get_product_2!(product.id) # added this line
    {:noreply, stream_insert(socket, :products, product)}
  end

Would this be the proper way of doing it, or is there a neater way?

al2o3cr

al2o3cr

handle_info already has a Product struct, why Repo.get it again?

zingo

zingo OP

I don’t know how to preload inside handle_info. I tried product = product |> Repo.preload([:category]) which didn’t work. Maybe if I alias Repo it will work. I’ll try that.

Edit: Yes it did work. Still learning, thanks :).

— All posts loaded —

Where Next? Top

Trending in Questions Top

stjefim
Hello! Suppose you are building workflow (order / task / payment) processing system with the following requirements: Each workflow con...
New
water
I’m aware of 2 such projects, are there others? git: GitHub - team-alembic/realworld: A fullstack Phoenix LiveView application with back...
New
itzmidinesh
Hi all, I’m working on a Phoenix project where I need to make external HTTP requests and I’m trying to choose between Req and HTTPoison....
New
peck
Hi everyone. My team and I have been working on a fairly modest app based around video streaming and chat, but we’ve landed a customer t...
New
leoschweizer
Hi, we run different LLM models across a cluster, with each node loading a configurable subset. Model-specific queues let nodes consume ...
New
csmr
Hi all, I’m new here and would like to hear peoples views on my Elixir/Phoenix based game-engine! :smiley: Mutonex gamedesign was finish...
New
Stef-Verniers
Hello I’ve been coding in Elixir for almost two years now because of my current job where we implemented Elixir in our application. But ...
New

Other Trending Topics Top

dominicletz
Hey there, I haven’t seen a list of useful Elixir specific skills for the popular AI tools yet so I’m starting one here with my first. ...
New
mudasobwa
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
webofbits
With AI doing more of the implementation work, I’ve been wondering how much coding I should deliberately keep doing myself. My main conc...
#ai
New
OndrejValenta
(I just needed to vent somewhere and LinkedIn is full of hope, or hype, I’m not sure which exactly) AI dream has many faces, but general...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews