Phoenix:从模板渲染JSON

Mla*_*vić 5 templates json phoenix-framework

我正在尝试创建一个非常简单的案例:一个控制器动作,该动作从模板呈现一个静态JSON。

控制器:

defmodule MyApp.TestController do
  use Phoenix.Controller

  def show(conn, _params) do
    render(conn, "show.json")
  end
end
Run Code Online (Sandbox Code Playgroud)

视图:

defmodule MyApp.TestView do
  use MyApp.Web, :view
end
Run Code Online (Sandbox Code Playgroud)

show.json.eex

{
  "message": "Hello, world!"
}
Run Code Online (Sandbox Code Playgroud)

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

"{\n  \"message\": \"Hello, world!\"\n}"
Run Code Online (Sandbox Code Playgroud)

任何想法为什么,以及如何解决?

/编辑:

我发现可以通过将模板重命名为其他名称json(当然,还要明确设置响应类型)来解决此问题,因此显然可以对JSON模板进行额外编码。但是为什么,谁会想要这样的东西呢?

Mla*_*vić 6

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

在确定内容是来自模板还是来自视图中的数据结构时,Phoenix不知所措。render/2从控制器愉快地获取任何内容并将其转换为JSON。

我撰写了有关此问题的更详细的博客文章,以及解决该问题的几种方法,我认为每种方法都可以解决Phoenix中的固有问题(诚然,这并不是很关键)。

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