zingo

zingo OP

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?

First 6 of 6 Posts Switch mode

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
jonnycharles
I’m in search of an Elixir library that offers PDF generation capabilities similar to Ruby’s Prawn. While there have been discussions abo...
New
spammy
I’m looking to build a personal workflow to quickly deploy web applications written in elixir/phoenix, for local consumption (ie not on t...
New
dli
Before I dive in myself, did anyone successfully sprinkle Hologram into their existing LiveView app? Looking for hints regarding: Addi...
New
bottlenecked
Hi all, I wanted to ask how the community is dealing with post-release steps. Today we have Ecto migrations, which make sure that the db...
New
roeland
Kia ora, We have been using elixir-google-api to connect to Google Drive. However, with the updates to Tesla due to CVEs this is now bro...
New
rahultumpala
Hello, I have an Elixir backend that implements a custom protocol over TCP. I want to load test the backend and assess the performance o...
New

Other Trending Topics Top

JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
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
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge &amp; Solve. They are GUI (Emerge) and State management (S...
New
netoum
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
ausimian
Emily is an Elixir library that runs Nx computations on Apple’s MLX. Install it as the default Nx backend and Nx, defn, Axon, Nx.Serving,...
New
juhalehtonen
There has been a thread to discuss the Stack Overflow Developer Survey on this forum every year since 2018, so here’s yet another one for...
New

We're in Beta

About us Mission Statement