Как использовать «Phoenix.View.render_to_string (…)» с текстовыми шаблонами? - PullRequest
0 голосов
/ 14 февраля 2019

Есть ли альтернатива специально для текстовых шаблонов?

В текстовом шаблоне у меня также есть переменные эликсира, которые мне нужно заменить значениями.То есть это «soemthing.txt.eex», а не просто «.txt»

1 Ответ

0 голосов
/ 14 февраля 2019

Имеются следующие шаблоны:

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 , например, > заменяется на &gt;, чтобы браузер не отображал 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 в строке.

...