gpt4 book ai didi

json - Phoenix : render JSON from a template

转载 作者:行者123 更新时间:2023-12-02 04:00:14 25 4
gpt4 key购买 nike

我正在尝试创建一个非常简单的案例:一个从模板呈现静态 JSON 的 Controller 操作。

Controller :

defmodule MyApp.TestController do
use Phoenix.Controller

def show(conn, _params) do
render(conn, "show.json")
end
end

查看:

defmodule MyApp.TestView do
use MyApp.Web, :view
end

show.json.eex:

{
"message": "Hello, world!"
}

问题是,我得到了正确的 JSON 响应,但是是 JSON 编码的:

"{\n  \"message\": \"Hello, world!\"\n}"

知道原因以及如何解决吗?

/编辑:

我发现我可以通过将模板重命名为 json 以外的名称来解决这个问题(当然还要显式设置响应类型),所以显然 JSON 模板是另外编码的。但为什么,谁会想要这样的东西呢?

最佳答案

经过进一步调查并与 Phoenix Slack channel 的人们交谈后,我对正在发生的事情有了更清晰的了解:

Phoenix 在决定内容是来自模板还是来自 View 中的数据结构时是不可知的。 Controller 中的 render/2 很乐意接受任何内容并将其转换为 JSON。

我写了一个more detailed blog post关于这个问题,以及解决它的几种方法,在我看来,每一种都是针对 Phoenix 固有问题的解决方法(诚然,这远非关键)。

本质上,应该避免执行从 render_to_iostream 函数调用的 Poison.encode 函数。您可以通过不使用 .json 作为模板扩展、直接从 Controller 调用 Phoenix.View.render 或创建自定义编码器和模板引擎来实现此目的。传递一些元数据以及要输出的数据。

关于json - Phoenix : render JSON from a template,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39769096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com