【问题标题】:Phoenix: render JSON from a templatePhoenix:从模板渲染 JSON
【发布时间】:2016-10-05 04:39:22
【问题描述】:

我正在尝试创建一个非常简单的案例:从模板呈现静态 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 模板是额外编码的。但是为什么,谁会想要这样的东西呢?

【问题讨论】:

    标签: json templates phoenix-framework


    【解决方案1】:

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

    Phoenix 在决定内容是来自模板还是来自视图中的数据结构时是不可知的。来自控制器的render/2 很乐意接受任何内容并将其转换为 JSON。

    我就这个问题写了more detailed blog post,以及解决它的几种方法,在我看来,每一种方法都是解决 Phoenix 固有问题的一种解决方法(诚然,这远非关键)。

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

    【讨论】:

    • 但是如何从 postgresql 中获取 json 值??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 2016-11-13
    • 1970-01-01
    • 2016-07-18
    • 2011-12-27
    相关资源
    最近更新 更多