2016-07-23 2 views
0

Я пытаюсь создать приложение Phoenix сгенерированный html, а также ответы json api. Это то, что я сделал до сих пор:Phoenix json возвращает только идентификаторы

mix phoenix.gen.html User users name:string email:string 
mix phoenix.gen.json Api.User users --no-model 

Тогда я изменил псевдоним в UserController от «псевдоним MyApp.Api.User» до «псевдоним Api.User». И это работает! .. хорошо почти все!

Это то, что я получаю в ответ HTTP:

{"data":[{"id":1},{"id":2}]} 

Проблема Я пытаюсь исправить это - когда я называю GET на Апи, я просто получить список идентификаторов; все другие полезные поля не возвращаются. IO.inspect говорит мне, что контроллер возвращает все. Таким образом, это должно быть представление, которое фильтрует поля.

Однако мое понимание Эликсира/Феникса здесь не подходит. Это то, что я вижу:

def render("index.json", %{users: users}) do 
    %{data: render_many(users, MyApp.Api.UserView, "user.json")} 
    end 

Мой основной вопрос - Как я могу нырять в методе render_many и выяснить, что происходит, чтобы исправить это?

Мои вторичные вопросы:

  • Есть ли хороший ресурс, чтобы получить HTML и JSON API, работая вместе в Финиксе?
  • Что такое "user.json" в коде выше? Что касается «index.json», я думаю, что он используется только для сопоставления шаблонов.

ответ

1

Там должен быть следующий код в web/views/api/user_view.ex:

def render("user.json", %{user: user}) do 
    %{id: user.id} 
end 

Вам просто нужно добавить несколько полей в том, что:

def render("user.json", %{user: user}) do 
    %{id: user.id, name: user.name, email: user.email} 
end 

или

def render("user.json", %{user: user}) do 
    Map.take(user, [:id, :name, :email]) 
end 

documentation объясняет как Phoenix.View.render_many/4 работает в деталях.

Есть ли хороший ресурс для получения html и json api, работающих вместе в Phoenix?

Я не знаю никого.

Что такое "user.json" в коде выше? Что касается «index.json», я думаю, что он используется только для сопоставления шаблонов.

Да, этот параметр передается render по render_many. См. Ссылку на документацию выше.

0

Есть ли хороший ресурс для получения html и json api, работающих вместе в Фениксе?

Если HTML и JSON использовать один и тот же ресурс & логики, и они, вероятно, должны, вы можете сделать следующее:

На ваш взгляд, определяют как «.html» и «.json» положения, например

def render("show.json", %{user: user}) do 
    %{...} 
end 

def render("show.html", %{user: user}) do 
    render ... 
end 

В вашем контроллере измените строку, например. "show.html", до атома без суффикса, например. :show

В маршрутизаторе, убедитесь, что вы принимаете как html и json в вашем трубопроводе

И феникс должен формировать ответы в соответствии формате, когда запросы приходят в.

+0

В этом случае контроллер должен знать является ли запрошенный ресурс html или json, который может быть прочитан из объекта соединения. Другая проблема - контроллеры html и json api по-разному. Контроллер json api добавляет код состояния для ответа, тогда как контроллер html этого не делает. – Puneet

+0

код статуса не имеет большого значения для запросов, ожидающих html. @ user246615 – prM

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