ycv005
Want to pass data using phx-value, getting Error of protocol Phoenix.HTML.Safe not implemented for %{.....}
I want to pass the data using the phx-value but getting Error of protocol Phoenix.HTML.Safe not implemented for %{…}. Following is my code-
phx-value="<%= @job_opening %>"
I think my error is because the data present in the job_opening is like %{.........} (Map/Struct like data).
How can I pass this data, any other way? Your response will be highly appreciable.
Most Liked
LostKobrakai
I think you’re not completely aware of how live-view works. You cannot pass data you have at the time of rendering to the socket handling the updates. Those are completely different processes, which never communicate directly which each other. The only data the socket connection receives comes from the rendered html the client received (or from messages sent to the socket, but the socket does not yet exist at the time of rendering).
peerreynders
The documentation suggests to me that the handle_event/3 params are used for form submissions.
- An optional
"phx-value"binding on the clicked element
Try something like
phx-click="archive_stage" phx-value="<%= @job_opening.id %>"
def handle_event("archive_stage", job_opening_id, socket)
i.e. only use the minimal amount of information to identify the entity - not the whole data that is the entity.
fazibear
Hi, I’ve got the same problem, ended up with binary_to_term and base64.
Code look like this:
defmodule SomethingWeb.SomethingLive do
use Phoenix.LiveView
def render(assigns) do
~L"""
<div phx-click="test" phx-value="<%= encode(%{value: 1, test: "..."}) %>">ClickMe</div>
"""
end
def handle_event("test", data, socket) do
data = decode(data)
# data.value => 1
# data.test => ".."
{:noreply, socket}
end
defp encode(value) do
value
|> :erlang.term_to_binary()
|> Base.encode64()
end
defp decode(value) do
value
|> Base.decode64()
|> elem(1)
|> :erlang.binary_to_term()
end
end







