如何在文本模板中使用“ Phoenix.View.render_to_string(…)”?

时间:2019-02-14 01:39:11

标签: html elixir phoenix-framework

是否有专门用于文本模板的替代方法?

在文本模板中,我还有需要用值替换的长生不老药变量。也就是说,它是一个“ soemthing.txt.eex”,而不仅仅是一个“ .txt”

1 个答案:

答案 0 :(得分:0)

给出以下模板:

world.html.eex

<h1>From a template: Hello <%= String.capitalize(@name) %></h1>

world.txt.eex

From a template: Hello <%= String.capitalize(@name) %>

在每个模板上调用render()render_to_string()render_to_iodata()之后,shell中会有一些结果:

~/phoenix_apps/hello$ iex -S mix
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
Interactive Elixir (1.6.6) - press Ctrl+C to exit (type h() ENTER for help)

iex(1)> Phoenix.View.render_to_iodata(HelloWeb.HelloView, "world.html", conn: %Plug.Conn{}, name: "Wintermute")
["<h1>From a template: Hello ", "Wintermute", "</h1>\n"]

iex(2)> Phoenix.View.render_to_string(HelloWeb.HelloView, "world.html", conn: %Plug.Conn{}, name: "Wintermute")
"<h1>From a template: Hello Wintermute</h1>\n"

iex(3)> Phoenix.View.render(HelloWeb.HelloView, "world.html", conn: %Plug.Conn{}, name: "Wintermute")          
{:safe, ["<h1>From a template: Hello ", "Wintermute", "</h1>\n"]}

iex(4)> 
nil
iex(5)> 
nil

iex(6)> Phoenix.View.render_to_iodata(HelloWeb.HelloView, "world.txt", conn: %Plug.Conn{}, name: "Wintermute") 
"From a template: Hello Wintermute\n"

iex(7)> Phoenix.View.render_to_string(HelloWeb.HelloView, "world.txt", conn: %Plug.Conn{}, name: "Wintermute") 
"From a template: Hello Wintermute\n"

iex(8)> Phoenix.View.render(HelloWeb.HelloView, "world.txt", conn: %Plug.Conn{}, name: "Wintermute")           
"From a template: Hello Wintermute\n"

iex(9)> 

因此,对我来说,当文件为.txt.eex文件时,您可以使用任何渲染功能。

  

如何将Phoenix.View.render_to_string(…)与文本一起使用-非HTML-   模板?

我不知道是否有更好的方法,但这可行:

defmodule HelloWeb.HelloController do
  use HelloWeb, :controller

  def world(conn, %{"name" => name}) do
    str = Phoenix.View.render_to_string(
              HelloWeb.HelloView, 
              "world.txt", 
              conn: %Plug.Conn{}, 
              name: name)
    text(conn, str)
  end

end

hello_web / templates / hello / world.txt.eex

From a template: Hello <%= String.capitalize(@name) %>

似乎text() html实体替换了str中的所有html字符,例如>替换为&gt;,以使浏览器不会呈现html。

  

是否有专门用于文本模板的替代方法?

完成同一件事的另一种方法是直接使用EEx(嵌入式Elixir)进行变量替换。诀窍是获取模板文件的路径:

hello / priv / my_text_templates / world.txt:

<%= greeting %> <%= String.capitalize(name) %>!

控制器

defmodule HelloWeb.HelloController do
  use HelloWeb, :controller

  def world(conn, %{"name" => name}) do

    template_path = Path.join([
                      :code.priv_dir(:hello), 
                      "my_text_templates", 
                      "world.txt.eex"])
    str = EEx.eval_file(
            template_path,
            [greeting: "Hello", name: name]
          )

    text(conn, str)
  end

end

顺便说一下,htmljson都是字符串-浏览器在看到字符串中的html时会做一些不同的事情。