如何在 Phoenix 渲染函数中用 ~H 替换已弃用的 ~E sigil

How to replace deprecated ~E sigil with ~H in Phoenix render funciton

背景

在我学习 Phoenix LiveView 的过程中,我发现自己使用了一个使用已弃用印记的渲染函数:

  def render(_assigns) do
    ~E"""
    <menubar>
      <menu label="<%= gettext "File" %>">
          <hr/>
          <item onclick="quit"><%= gettext "Quit" %></item>
      </menu>
      <menu label="<%= gettext "Extra" %>">
          <item onclick="browser"><%= gettext "Open Browser" %></item>
      </menu>
    </menubar>
    """
  end

现在,我知道在 Elixir 中使用 eex 代码是安全的。但是编译器说我应该用 ~H 替换它。所以我的第一次尝试如下:

  def render(assigns) do
    ~H"""
    <menubar>
      <menu label="{@gettext('File')}">
          <hr/>
          <item onclick="quit"><%= gettext "Quit" %></item>
      </menu>
      <menu label="{@gettext 'Extra'}">
          <item onclick="browser"><%= gettext "Open Browser" %></item>
      </menu>
    </menubar>
    """
  end

哪个不起作用,也没有在菜单中正确显示文本:

问题

我做错了什么?

回答

我尝试的问题是 @ 字符。我可能没有理解错误消息并得出结论 @ 必须是变量的一部分。

正确的版本是这样的:

  def render(assigns) do
    ~H"""
    <menubar>
      <menu label={gettext("File")}>
          <hr/>
          <item onclick="quit"><%= gettext "Quit" %></item>
      </menu>
      <menu label={gettext("Extra")}>
          <item onclick="browser"><%= gettext "Open Browser" %></item>
      </menu>
    </menubar>
    """
  end