pedromvieira

pedromvieira

How to replace "direct/simple" sigil_E to new sigil_H to avoid warnings?

Updating to Elixir 1.13 and got several warnings about sigil_E deprecation:

warning: Phoenix.HTML.sigil_E/2 is deprecated. use the ~H sigil instead

Assuming that not everything is (and will be) LiveView yet, how to correct the simple / direct sigil_E to new implementations (and to avoid warnings)?

...
import Phoenix.HTML, only: [sigil_E: 2, safe_to_string: 1]
...
def my_fun(arg1) do
  safe_html =
    ~E"""
      <div class="<%= arg1.class %>">
        <%= arg1.message %>
      </div>   
    """
    _html =
      safe_html
      |> safe_to_string()
end

This results in:

SAFE_HTML
{:safe, ["<div class=\"myclass\">ALOHA</div>"]}

HTML
"<div class=\"myclass\">ALOHA</div>"

Marked As Solved

sodapopcan

sodapopcan

Oh sorry, I misread.

I did some playing around (first time I made use of Mix.install/1 which was super cool!) and it looks like what you’re looking for is Phoenix.HTML.Safe.to_iodata/1 (see here). And for identical results you’re going to want to call List.to_string/1 on the result.

YouComponent.test_h()
|> Phoenix.HTML.Safe.to_iodata()
|> List.to_string()

EEx and heex work very differently as heex does change tracking.

I am curious as to why you need this, though. Other than having to change how attribute values are passed, changing to heex should just be a matter of just switching up the sigil.

Also Liked

schnittchen

schnittchen

For me it was not just replacing ~E with ~H and changing the HTML attribute syntax. I got undefined function assigns/0 each time and had to add assigns = %{} each time even though the ~H snippet did not use any assign. See also "undefined function assigns/0" while trying to use Phoenix.LiveViewTest.rendered_to_string/1 · Issue #1798 · phoenixframework/phoenix_live_view · GitHub

markmark206

markmark206

In case this is useful for anyone, here is a working example of composing safe HTML text using an ~H block:

defmodule EmailBody do
  import Phoenix.Component, only: [sigil_H: 2]

  def compose(question_of_the_day) do
    assigns = %{
      question: question_of_the_day
    }

    ~H"""
    <div><%= @question %>?</div>
    """
    |> Phoenix.HTML.Safe.to_iodata()
    |> List.to_string()
  end
end
$ iex -S mix
...
iex(20)> "Why did the chicken cross the road (and here is a rogue div: <div>)" |> EmailBody.compose()
"<div>Why did the chicken cross the road (and here is a rogue div: &lt;div&gt;)?</div>"

The rogue <div> in the template parameter is safely escaped in the resulting string.

Where Next?

Popular in Questions Top

srinivasu
How to handle excepions in elixir? Suppose i have A, B, C ,D, E modules. and each module has get() function. A.get() method will call th...
New
Werner
Hi, I’m using Ubuntu 18.04 and after updating to OTP-24.0 yesterday i have this warning when I run “mix local.hex”: 14:57:30.512 [warn] ...
New
SoCreat
i’m a new one to elixir which editor can i use vs code? or atom? Thanks! :smiley:
New
Kagamiiiii
Student &amp; New to elixir. Nice language. I want to convert a english character, e.g. “a”, which is stored in a variable, to it’s asci...
New
lk-geimfari
What is most correct way to open, read and parse JSON file with poison? For example if we have example.json file in root of some projec...
New
Fl4m3Ph03n1x
Background Let’s assume I have a typical GenServer that receives messages as requests, does some operation in a DB and returns responses....
New
gonzofish
I’m currently trying to understand how to join three tables using Ecto. All the examples I’ve seen use 2, so maybe I’m just missing somet...
New
chewm
Hi guys, nice to meet you to the whole forum, I’m new here, I’m trying to configure visual studio code for elixir, right now the intellis...
New
Fl4m3Ph03n1x
About me? ( if you have nothing better to do than reading about some random guy in the internet :stuck_out_tongue: ) Hello all, this is ...
New
wernerlaude
In AR this is so simple @articles = current_user.articles How to do in Ecto? def index(conn, _params) do current_user = conn.assig...
New

Other popular topics Top

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
bsollish-terakeet
Credo is smart enough to check for (something like) this: assert length(the_list) == 0 with this response: Checking if an enum is empt...
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New
malloryerik
Hi, this is for people who, like me, have had some friction using .html.heex templates in VSCode. The solution seems to be, in a hyphena...
New
KronicDeth
Elixir plugin for JetBrain’s IntelliJ Platform (including Rubymine) This is a plugin that adds support for Elixir to JetBrains IntelliJ...
289 35421 110
New
New
mcarvalho
What is the difference between System.get_env and Application.get_env? For example, what are best practices to use one versus another.
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
belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers' Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New

We're in Beta

About us Mission Statement