凤凰:从模板渲染JSON

6

我试图创建一个非常简单的例子:一个控制器操作,该操作从模板中呈现静态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模板还被编码了。但是,为什么会这样,有人会想要这样做吗?
1个回答

7

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

在决定内容是来自模板还是视图数据结构方面,Phoenix保持中立。控制器中的render/2函数可以接收任何内容并将其转换为JSON。

我写了一篇更详细的博客文章,讨论了此问题以及多种解决方案,就我个人而言,这些方案都是解决Phoenix固有问题的变通方法(尽管这些问题远非关键)。

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


但是如何从PostgreSQL获取JSON值? - Tab Key

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接