miguelcoba
Polymorphic_embed for LiveView 1.1
Does anyone have a working example of polymorphic_embed working with LiveView 1.1? Specifically the live view part (the backend part seems to work just fine).
I have followed the documentation but I see nothing on the browser. Nothing is emitted on the html if I inspect it.
Looking at the github issues/pull requests, it seems like it is kinda abandoned for the last year.
Any pointers to a working example or a fork that works for current (1.1) live view?
Thanks!
First Post!
brownerd
I’ve been using it, but in a project that’s still in development. Its working great for me. Do you have any code to post, like the Schema and LiveView that use polymorphic_embed?
I do remember being confused about the usage, but it working.
Most Liked
brownerd
Cool! Sorry for the late response, but I’m glad you figure it out. Like I said, I also remember running into some walls getting it to work the way I though it was supposed to. Like you, I eventually got it working and it has been great for me ever since. Best regards!
miguelcoba
Ok, I think I got it to work:
I added a default to the client_type:
field :client_type, Ecto.Enum, values: [:legal_entity, :individual], default: :legal_entity
Then the new puts the correct embedded struct, depending on the `client_type`:
defp apply_action(socket, :new, _params) do
client = %Client{user_id: socket.assigns.current_scope.user.id}
client =
case client.client_type do
:legal_entity ->
%Client{client | client_name: %LegalEntityName{}}
:individual ->
%Client{client | client_name: %IndividualName{}}
end
socket
|> assign(:page_title, gettext("New client"))
|> assign(:client, client)
|> assign(:form, to_form(Clients.change_client(socket.assigns.current_scope, client)))
end
And when validating, if the `client_type` changed, I change the polymorphic_embed struct too:
@impl true
def handle_event("validate", %{"client" => client_params}, socket) do
changeset =
Clients.change_client(socket.assigns.current_scope, socket.assigns.client, client_params)
changeset =
case Ecto.Changeset.get_change(changeset, :client_type) do
nil -> changeset
:legal_entity -> Ecto.Changeset.put_change(changeset, :client_name, %LegalEntityName{})
:individual -> Ecto.Changeset.put_change(changeset, :client_name, %IndividualName{})
end
{:noreply, assign(socket, form: to_form(changeset, action: :validate))}
end
The problem with replacing the client_name on the changeset when `client_type` changes is that the previous values are lost, but is something I can live with.
Thanks!
Popular in Questions
Other popular topics
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
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex









