Есть ли способ получить измененные данные из шаблона EEx

#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. Умно! И это также показывает, насколько эликсир-мощный язык. Спасибо.