2016-09-29 3 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}" 

Любая идея, почему и как ее решить?

/Edit:

я узнал, что я могу обойти эту проблему путем переименования шаблона к чему-то другому, чем json (плюс явно устанавливая тип ответа, конечно), так что, очевидно, шаблоны JSON дополнительно кодируются. Но почему, кто хотел бы такого?

ответ

4

После дальнейшего расследования и говорить с людьми на Phoenix Слака канала, у меня есть четкое представление о том, что происходит:

Phoenix агностика, когда дело доходит до принятия решения, идет ли содержимое из шаблона или из структуры данных в представлении. render/2 от контроллера с радостью берет что-то и конвертирует его в JSON.

Я написал more detailed blog post об этой проблеме, а также несколько подходов к ее решению, и, на мой взгляд, каждый из них является обходным решением для присущей проблемы в Фениксе (что, по общему признанию, далека от критического).

По существу, следует избегать выполнения функции Poison.encode, которая вызывается из функции render_to_iostream. Вы можете сделать это, не используя .json в качестве расширения шаблона, напрямую вызывая Phoenix.View.render с контроллера или создавая собственный механизм кодирования и шаблона для передачи некоторых метаданных вместе с данными, которые будут выводиться.

Смежные вопросы