2016-09-29 63 views
3

我想创建一个非常简单的情况:从模板呈现静态JSON的控制器操作。凤凰城:从模板呈现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模板附加编码的其他一些解决该问题。但为什么,谁会想要这样的事情?

回答

4

经过进一步调查,并与人们对凤凰时差频道说话,我对发生的事情更清晰的画面:内容是否来自一个模板或从数据结构

凤凰是不可知的,当谈到决定在视图中。来自控制器的render/2高兴地接受任何东西并将其转换为JSON。

我写了一个关于这个问题的more detailed blog post,以及解决这个问题的几种方法,在我看来,每一个都是解决凤凰城固有问题的一种解决方法(无可否认,这远远不是关键)。

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