2015-10-22 3 views
3

IO.puts (осмотр (контакты)) дает:возвращает список дает (Poison.EncodeError) не в состоянии кодировать значение,

[%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"} 

ответ

4

Вам нужно будет либо реализовать протокол Poison.Encoder для HelloTable.Contact, как описано в Encoding a Ecto Model to JSON in 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 generators.

+0

спасибо, это работает, просто не хватает запятой после контакта .имя. –

0

Другое, возможно более чистое решение с использованием более поздних версий яда описано в this response to a similar question.

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

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

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

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

  • Нет связанных вопросов^_^