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

问题描述

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

如果页面修改了会话(使用 cookie 配置),比如使用 session 之类的东西,这会修改连接,但它也保持在页面本地并且不会传播。

有没有办法从 EEx 引擎中检索这个修改后的连接版本?

注意:我说的是连接 (<% Plug.Conn.put_session(conn,"reply",42) %>),但它可以是由模板引擎修改或创建的任何变量,就像 Plug.Conn 所做的那样:{{1 }}。

解决方法

EEx.eval_fileEEx.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}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...