Elixir 有没有办法从EEx模板中获取修改后的数据
我使用EEx模板引擎来呈现HTML页面(这里没有Phoenix)。我正在将连接(Elixir 有没有办法从EEx模板中获取修改后的数据,elixir,plug,Elixir,Plug,我使用EEx模板引擎来呈现HTML页面(这里没有Phoenix)。我正在将连接(Plug.Conn)Conn连同提取的参数列表(params)和会话映射(session)一起传递到模板:body=EEx.eval_文件(路径,Conn:Conn,参数:Conn.params,session:session)params和session仅为方便起见而提供,因为它们也在连接中 如果页面修改会话(使用cookie配置),比如说使用类似),这会修改连接,但这也会保持页面的本地性,并且不会传播 有没有办法
Plug.Conn
)Conn
连同提取的参数列表(params
)和会话映射(session
)一起传递到模板:body=EEx.eval_文件(路径,Conn:Conn,参数:Conn.params,session:session)
params
和session
仅为方便起见而提供,因为它们也在连接中
如果页面修改会话(使用cookie配置),比如说使用类似
),这会修改连接,但这也会保持页面的本地性,并且不会传播
有没有办法从EEx引擎检索此修改版本的连接
注意:我说的是连接(
Plug.Conn
),但它可以是模板引擎修改或创建的任何变量,就像code.eval_字符串(“a=1\n b=2\n c=a+b”)
所做的:{3[a:1,b:2,c:3]}
EEx.eval_文件
和EEx.eval_字符串
都返回字符串
类型,它们不返回更新的绑定(就像您所说的那样,code.eval_字符串
返回)
我认为这背后的原因是希望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}
quote=EEx.compile\u字符串(“”)
{result,bindings}=Code.eval_quoted(quoted[a:1,b:2])
关键字.fetch(绑定,:c)#{:好的,3}
我知道这一点,我同意你的看法。我不是在谈论conn的副作用,而是在它通过EEx引擎后获得它的更新副本,就像它通过plug@mszmurlo回答更新聪明!这也说明了长生不老药是一种强大的语言。谢谢