#elixir #plug
Вопрос:
Я использую механизм шаблонов EEx для визуализации HTML-страниц (здесь нет Феникса). Я передаю соединение ( Plug.Conn
) conn
в шаблон вместе со списком извлеченных параметров ( params
) и картой сеанса ( session
) с помощью : body = EEx.eval_file(path, conn: conn, params: conn.params, session: session)
. params
и session
предоставляются только для удобства, так как они также находятся в соединении.
Если страница изменяет сеанс (настроенный с помощью файлов cookie), скажем, с помощью чего-то подобного <% Plug.Conn.put_session(conn, "reply", 42) %>
), это изменяет соединение, но оно также остается локальным для страницы и не распространяется.
Есть ли способ извлечь эту измененную версию соединения из механизма EEx ?
NB: Я говорю о соединении ( Plug.Conn
), но это может быть любая переменная, измененная или созданная механизмом шаблонов, просто аналогичным образом Code.eval_string("a=1n b=2n c=a b")
: {3, [a: 1, b: 2, c: 3]}
.
Ответ №1:
EEx.eval_file
и EEx.eval_string
оба возвращают String
тип, они не возвращают обновленные привязки (как, как вы говорите, Code.eval_string
происходит).
Я думаю, что причина этого в том, что вы хотите render
, чтобы функция не имела побочных эффектов (таких как вызовы базы данных или изменение сеанса).
Вам не нужна бизнес-логика в ваших шаблонах, вы хотите поместить ее в свой контроллер или уровень данных (с тем преимуществом, что вы можете протестировать ее изолированно).
Возможно, оффтопик, но если вы исходите из фона PHP (где вы можете поместить весь свой код в один файл, который выглядит как HTML-шаблон), это может быть источником путаницы.
Обновить
Хотя это может сработать:
quoted = EEx.compile_string("<%= c = a b %>")
{result, bindings} = Code.eval_quoted(quoted, [a: 1, b: 2])
Keyword.fetch(bindings, :c) # {:ok, 3}
Комментарии:
1. Я знаю это и согласен с вами. Я говорю не о побочных эффектах, а о
conn
том, чтобы получить обновленную копию, как только она прошла через механизм EEx, точно так же, как это происходит, когда она проходит через штекер2. Умно! И это также показывает, насколько эликсир-мощный язык. Спасибо.