Имеются следующие шаблоны:
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()
для каждого шаблона:
~/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 (Embedded Elixir) для подстановки переменных.Хитрость заключается в получении пути к файлу шаблона:
hello / priv / my_text_templates / world.txt:
<%= greeting %> <%= String.capitalize(name) %>!
controller :
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 в строке.