Na versão mais recente do Ecto 0.15.0, tive o seguinte erro ao tentar codificar um modelo de estrutura:
%User{name: "test"}
Mas isso gera um erro:
unable to encode value: {nil, "users"}
Por quê? Porque contém os dados privados __meta__
dentro da estrutura, com uma tupla como valor, que não é analisada corretamente pelo Poison.
A solução foi implementar o seguinte caso de cláusula Poison.Encoder:
defimpl Poison.Encoder, for: Any do
def encode(%{__struct__: _} = struct, options) do
map = struct
|> Map.from_struct
|> sanitize_map
Poison.Encoder.Map.encode(map, options)
end
defp sanitize_map(map) do
Map.drop(map, [:__meta__, :__struct__])
end
end
Isso está relacionado a este problema do github .