Want to pass data using phx-value, getting Error of protocol Phoenix.HTML.Safe not implemented for %{.....}

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