2016-09-29 8 views
3

非常に単純なケースを作成しようとしています。テンプレートから静的JSONをレンダリングするコントローラーアクションです。Phoenix:テンプレートから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関数の実行を本質的に避けるべきです。 .jsonをテンプレート拡張子として使用せず、コントローラーから直接Phoenix.View.renderを呼び出すか、カスタムエンコーダーとテンプレートエンジンを作成して、出力するデータとともにメタデータを渡すことによって行うことができます。

関連する問題