agonzalezro

agonzalezro

Liveview with a form that includes several changesets

Hi :wave:

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:

  1. I have added the embeds_many in the schema because it was the only way I found to create a form with several changesets. Is it right?
  2. Is belongs_to the 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.
  3. 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

Where Next?

Popular in Questions Top

chrisalley
ExUnit now has describe blocks which is a welcome addition coming from RSpec. In the docs, it states that nested hierarchies of describe ...
New
Tee
can someone please explain to me how Enum.reduce works with maps
New
joaquinalcerro
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
New
dokuzbir
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
nsuchy
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
vac
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
Phillipp
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
alice
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
fireproofsocks
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 Top

minhajuddin
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
senggen
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
albydarned
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
vac
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
mgjohns61585
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
danschultzer
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...
548 27727 240
New
aadeshere1
I have a another noob question about loop. Since elixir is immutable, while loop is not directly possible. total = 10 while total != 0 ...
New
johnnyicon
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
joeerl
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
magnetic
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

We're in Beta

About us Mission Statement