是否有专门用于文本模板的替代方法?
在文本模板中,我还有需要用值替换的长生不老药变量。也就是说,它是一个“ soemthing.txt.eex”,而不仅仅是一个“ .txt”
答案 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字符,例如>
替换为>
,以使浏览器不会呈现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
顺便说一下,html
和json
都是字符串-浏览器在看到字符串中的html时会做一些不同的事情。