agonzalezro
Hi ![]()
I am trying to create a live view that shows a form. This form will allow you to create an snapshot per each product you own. The snapshots saves a quantity and a reference to the product.
There is another field rate that I will remove from the snippets for simplicity:
# snapshot.ex
defmodule xxx.Snapshots.Snapshot do
...
schema "snapshots" do
embeds_many :items, Item do
field(:quantity, :integer)
belongs_to(:product, Product)
timestamps()
end
end
...
def new_item_changeset(snapshot, params \\ %{}) do
snapshot
|> cast(params, [:quantity, :product_id])
|> validate_number(:quantity, greater_than_or_equal_to: 0)
end
end
I have this view:
# dashboard_live.ex
defmodule xxxWeb.DashboardLive do
...
@impl true
def mount(_params, session, socket) do
current_user = Accounts.get_user_by_session_token(session["user_token"])
products = Products.get_by_user!(current_user)
items =
products
|> Enum.map(fn product ->
params = %{product_id: product.id}
Snapshot.new_item_changeset(
%Snapshot.Item{
product: product # preload
},
params
)
end)
form =
Ecto.Changeset.put_embed(
Ecto.Changeset.change(%Snapshot{}),
:items,
items
)
|> to_form
{:ok,
socket
|> assign(:page_title, "Dashboard")
|> assign(form: form |> IO.inspect())
|> stream(:products, products)}
end
def render(%{live_action: :show} = assigns) do
~H"""
<.form for={@form} phx-change="validate" phx-submit="save">
<%= for snapshot <- @form.source.changes.items do %>
<div><%= snapshot.data.product.description %></div>
<%!-- <div><%= product.type %></div> --%>
<.input type="number" field={snapshot[:quantity]} />
<% end %>
<%!-- <%= for item <- @form[:items] do %>
<.input type="number" field={item[:quantity]} />
<% end %>
--%>
<button>Add snapshot</button>
</.form>
"""
end
end
I have several questions here:
- I have added the
embeds_manyin the schema because it was the only way I found to create a form with several changesets. Is it right? - Is
belongs_tothe best way to scheme this? A user has N products where N can be dynamic through time. The snapshot is a snapshot (sorry) of that moment in time adding the quantity of products they own. - I am able to list the product description with
<%= snapshot.data.product.description %>however I don’t know how to make the<.input />work as it is a changeset inside a changeset and not a form.
Any other suggestion/help would be more than welcome. I am trying to do this to understand LiveViews so I want to be the closest to the “credo” as possible.
Thanks!
Trending in Questions
Hey guys,
I’ve got a huge CSV ( around 10 GB ) that needs to be processed hourly
Do you guys have any suggestions what is the best prac...
New
Hello!
Could someone please give me a help/sample code, how to delete a file from s3 using waffle/waffle_ecto from Phoenix app.
I creat...
New
I’m seeing that a list inside a Kino.DataTable will be interpreted as a charlist, even if the Kino.configure() is set to charlists: :as_l...
New
Anyone here using Honeybadger?
My Honeybadger account is being overwhelmed with noise from some bots. Seeing a lot of
Bandit.HTTPError...
New
So my question is quite simple and i have found no conclusive answer on forum, google or AI.
Should we use :erlang.float for Integer to ...
New
Hi, I’ve just set up an application with ash_authentication. There is only magic link strategy for now, so there is no confirmation add o...
New
If a change or preparation module uses Ash.Changeset.get_argument/2 or Ash.Query.get_argument/2 (or any of the other get_argument functio...
New
Other Trending Topics
I am happy to introduce the very α version of the new programming language compiled to BEAM.
Welcome Cure.
It has literally three kille...
New
Hobbes is a low-level distributed database for the Elixir programming language.
Hobbes provides a simple, safe, and scalable storage lay...
New
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve.
They are GUI (Emerge) and State management (S...
New
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #blog-post
- #elixir-ls
- #elixirconf-us
- #ai
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #hex
- #security
- #metaprogramming











Showing Posts 1 to 5- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
cmo
Use
inputs_foron embeds.agonzalezro
Thanks @cmo!
I was able to make it work with the following change as your proposed:
Do you have any other suggestion for the other questions?
I will move this changeset creation to the schema file:
But I am still not sure if it is exactly how it should be done or if it could be somehow simplified.
Thanks again!
cmo
the cheat sheets are your friend here
You can create an embedded schema or go schemaless for the form. This is handy when the db and form are not 1:1. On load, go from db represenstations to form, and the reverse on save.
agonzalezro
Thanks for the cheat sheet @cmo, really helpful!
I will keep in mind what you said about the schemas as well.
agonzalezro
In case it helps this is what the
formhas:And what I need to preload is the
productinside that#Cleanhen.Snapshots.Snapshot.Item<>.