json - Phoenix : render JSON from a template

标签 json templates phoenix-framework

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

相关文章:

指向具有(虚拟)继承的模板类的 C++ 指针

elixir - Ecto build_assoc/3 与定义的外键不匹配?

templates - Golang 模板引擎管道

c++ - 如何声明自引用模板 typedef

javascript - 如何给评论添加回复功能?

javascript - 使用 axios 获取本地 JSON 数据时遇到问题

elixir - Phoenix 的 HTTP GET 搜索表单

Elixir phoenix 设置 websocket 响应头

python - 如何将此 JSON 加载到数据框中?

json - 使用 2 种嵌套类型解析 JSON