Packages
phoenix_ecto
0.8.1
4.7.0
4.6.6
4.6.5
4.6.4
4.6.3
4.6.2
4.6.1
4.6.0
4.5.1
4.5.0
4.4.3
4.4.2
4.4.1
4.4.0
4.3.0
4.2.1
4.2.0
4.1.0
4.0.0
3.6.0
3.5.0
retired
3.4.0
3.3.0
3.2.3
3.2.2
3.2.1
3.2.0
3.1.0
3.1.0-rc.0
3.0.1
3.0.0
3.0.0-rc.0
3.0.0-beta.2
3.0.0-beta.1
3.0.0-beta.0
2.0.3
2.0.2
2.0.1
2.0.0
1.2.0
1.1.0
1.0.0
0.9.0
0.8.1
0.8.0
0.7.0
0.6.0
0.5.0
0.4.0
0.3.2
0.3.1
0.3.0
0.2.0
0.1.0
Integration between Phoenix & Ecto
Current section
Files
Jump to
Current section
Files
lib/phoenix_ecto/json.ex
if Code.ensure_loaded?(Poison) do
defimpl Poison.Encoder, for: Ecto.Changeset do
def encode(changeset, opts) do
encode_changeset(changeset)
|> Poison.Encoder.encode(opts)
end
defp encode_changeset(%{errors: errors, changes: changes, types: types}) do
errors
|> Enum.reverse()
|> merge_error_keys()
|> merge_embed_keys(changes, types)
end
defp merge_error_keys(errors) do
Enum.reduce(errors, %{}, fn({k, v}, acc ) ->
v = json_error(v)
Map.update(acc, k, [v], &[v|&1])
end)
end
defp merge_embed_keys(map, changes, types) do
Enum.reduce types, map, fn
{field, {:embed, %{cardinality: :many}}}, acc ->
if changesets = Map.get(changes, field) do
Map.put(acc, field, Enum.map(changesets, &encode_changeset/1))
else
acc
end
{field, {:embed, %{cardinality: :one}}}, acc ->
if changeset = Map.get(changes, field) do
Map.put(acc, field, encode_changeset(changeset))
else
acc
end
{_, _}, acc ->
acc
end
end
defp json_error(msg) when is_binary(msg), do: msg
defp json_error({msg, count: count}) when is_binary(msg) do
String.replace(msg, "%{count}", to_string(count))
end
end
defimpl Poison.Encoder, for: Ecto.Association.NotLoaded do
def encode(%{__owner__: owner, __field__: field}, _) do
raise "cannot encode association #{inspect field} from #{inspect owner} to " <>
"JSON because the association was not loaded. Please make sure you have " <>
"preloaded the association or remove it from the data to be encoded"
end
end
end