agonzalezro
Liveview with a form that includes several changesets
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!
Marked As Solved
cmo
Use inputs_for on embeds.
https://hexdocs.pm/phoenix_live_view/Phoenix.Component.html#inputs_for/1
2
Popular in Questions
ExUnit now has describe blocks which is a welcome addition coming from RSpec. In the docs, it states that nested hierarchies of describe ...
New
can someone please explain to me how Enum.reduce works with maps
New
Hi there,
I am working with Ecto-Postgresql and I need to call all of the records from a specific table but the table has 40,000 record...
New
I have an umbrella app.
Some of the apps inside depend on other apps in the umbrella, unsurprisingly.
I'm writing a test for one of t...
New
Hello,
I am trying to convert my lists to string without losing brackets.For start i have 3 map. They look like these
buyer = %{
id: ...
New
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
Hi,
I'm quite new in Elixir and I'm trying to format a string to a PEM format. I have the certificate value like MIIDBTCCAe2...... and ...
New
Hey,
I have a NanoPi-M3 and try to install Elixir on their Ubuntu image. I followed the Raspberry Pi installation instructions from the ...
New
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
Forgive me if this is obvious, but how does one delete a database record WITHOUT selecting it first? https://hexdocs.pm/ecto/Ecto.Repo.h...
New
Other popular topics
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1]
15:22:35.803 [error] gen_event {lager_file_backend...
New
Hello all!
I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
New
Hi,
I'm quite new in Elixir and I'm trying to format a string to a PEM format. I have the certificate value like MIIDBTCCAe2...... and ...
New
Could someone help me? I'm making my first elixir program, number guessing game. I can't figure out how to convert the user's guess from ...
New
None of the current solutions worked well for me, so I went ahead and built a user management system from scratch.
This project took far...
New
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible.
total = 10
while total != 0
...
New
Hi all,
I've just started learning Elixir and Phoenix Framework, so please pardon my n00bness at this stage.
I'm trying to use Postg...
New
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New
Hey :wave:t3: Elixir community,
I’ve been learning Elixir, and working on some side projects. My editor of choice is VSCode, and althoug...
New








