有没有办法从 EEx 模板中获取修改后的数据

Is there a way to get the modified data from within a EEx template

我正在使用 EEx 模板引擎呈现 HTML 页面(这里没有 Phoenix)。我将连接 (Plug.Conn) conn 连同提取的参数列表 (params) 和会话映射 (session) 一起传递给模板:body = EEx.eval_file(path, conn: conn, params: conn.params, session: session).提供 paramssession 只是为了方便,因为它们也在连接中。

如果页面修改了会话(配置了 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]}.

EEx.eval_fileEEx.eval_string 都是 return 一个 String 类型,它们不 return 更新的绑定(就像你说的,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}