возврат списка дает (Poison.EncodeError) невозможность кодирования значения

IO.puts(проверить(контакты)) дает:

 [%HelloTable.Contact{__meta__: #Ecto.Schema.Metadata<:loaded>, 
 id: 37,   
 inserted_at: #Ecto.DateTime<2015-10-22T12:50:43Z>, 
 name: "Gumbo", phone: "(801) 555-55555", 
 updated_at: #Ecto.DateTime<2015-10-22T12:50:43Z>}]

И вид выглядит так:

defmodule HelloTable.ContactView do
  use HelloTable.Web, :view

  def render("index.json", %{contacts: contacts}) do
    IO.puts(inspect( contacts ))
    contacts
  end

end

Как только я пытаюсь отобразить это представление, я получаю:

** (Poison.EncodeError) unable to encode value: {nil, "contacts"}

person rogergl    schedule 22.10.2015    source источник


Ответы (2)


Вам нужно будет либо реализовать протокол Poison.Encoder для HelloTable.Contact, как описано в Кодирование модели Ecto в JSON в elixir или возвращение карты из функции рендеринга с помощью render_many/4:

defmodule HelloTable.ContactView do
  use HelloTable.Web, :view

  def render("index.json", %{contacts: contacts}) do
    render_many(contacts, __MODULE__, "contact.json")
  end

  def render("contact.json", %{contact: contact}) do
    %{
      id: contact.id,
      name: contact.name,
      phone_number: contact.phone
    }
  end    
end

Выше показано, как JSON обрабатывается в Генераторы Phoenix JSON.

person Gazler    schedule 22.10.2015
comment
спасибо, все работает, просто отсутствует запятая после contact.name. - person Alex Spring; 24.03.2016
comment
Это не работает. Также вам не хватает %{data: render_many...}% в вашем первом def. - person Peter Weyand; 06.10.2018

Другое, возможно, более чистое решение с использованием более поздних версий отравления описано в этот ответ на аналогичный вопрос.

Добавьте эту строку кода в свою модель:

@derive {Poison.Encoder, only: [:name, :phone]}

(вы также можете включить :updated_at, если хотите, чтобы это поле было включено в ваш JSON)

person tomf    schedule 08.04.2017