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
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
Hello,
I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
Hi everyone,
I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding.
I sta...
New
Documentation
While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
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
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
apply_graft/2 doesn’t rewrite an add_many sub-workflow’s deps on an add step. Grafted jobs cancel with “upstream job was deleted”
Version...
New
Other Trending Topics
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
I am happy to introduce the very α version of the new programming language compiled to BEAM.
Welcome Cure.
It has literally three kille...
New
Hi there! We created Gust: A task orchestrator inspired by Airflow.
For those who have never heard about Aiflow, it’s a Python-based wor...
New
Hi everyone!
The first release candidate for the Expert language server project is now available!
We’ve published a press release detai...
New
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Xamal is a deployment tool for Elixir apps that deploys native releases to bare metal servers over SSH. It’s a port of GitHub - basecamp/...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixirconf-us
- #ai
- #blog-post
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #hex
- #security










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<>.