我正在尝试创建一个非常简单的案例:一个从模板呈现静态 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/