有没有办法从 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)
.提供 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]}
.
EEx.eval_file
和 EEx.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}
我正在使用 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]}
.
EEx.eval_file
和 EEx.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}