我试图创建一个非常简单的案例:一个控制器动作,它从模板中呈现静态JSON。
控制器:
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模板还要进行编码。但为什么,谁会想要这样的东西?
答案 0 :(得分:4)
经过进一步调查并与Phoenix Slack频道的人交谈后,我对发生的事情有了更清晰的了解:
Phoenix在确定内容是来自模板还是来自视图中的数据结构时是不可知的。来自控制器的render/2
愉快地接受任何操作并将其转换为JSON。
我写了一篇more detailed blog post关于这个问题,以及解决这个问题的几种方法,而且我认为每一个都是菲尼克斯固有问题的解决方法(诚然,这远非关键)。 / p>
基本上,应该避免执行从Poison.encode
函数调用的render_to_iostream
函数。您可以通过不使用.json
作为模板扩展,直接从控制器调用Phoenix.View.render
,或者通过创建自定义编码器和模板引擎来传递一些元数据以及要输出的数据来实现。