0

我正在使用 EEx 模板引擎来呈现 HTML 页面(这里没有 Phoenix)。我将连接 ( 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 引擎检索这个修改后的连接版本?

注意:我说的是连接(Plug.Conn),但它可以是由模板引擎修改或创建的任何变量,就像类似的方式Code.eval_string("a=1\n b=2\n c=a+b")一样:{3, [a: 1, b: 2, c: 3]}

4

1 回答 1

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}
于 2021-05-25T11:23:43.647 回答