2016-09-29 66 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或通過創建自定義編碼器和模板引擎來傳遞一些元數據以及要輸出的數據來實現。