3

IO.puts(inspect(contacts)) 给出:

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

2 回答 2

6

您将需要实现Poison.Encoder协议,HelloTable.ContactEncoding 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

以上是Phoenix JSON generators中 JSON 的处理方式。

于 2015-10-22T13:11:22.023 回答
0

在对类似问题的回复中描述了另一种可能更清洁的解决方案,使用更高版本的毒药。

将这行代码添加到您的模型中:

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

(如果您希望该字段包含在 JSON 中,您还可以包含 :updated_at)

于 2017-04-08T16:41:59.720 回答