问题描述
我使用 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_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}