Elixir Poison.EncodeError无法对值进行编码:{“已采取”,[]}
我试图返回无效的变更集 当做Elixir Poison.EncodeError无法对值进行编码:{“已采取”,[]},elixir,phoenix-framework,elixir-poison,Elixir,Phoenix Framework,Elixir Poison,我试图返回无效的变更集 当做 conn |> put_status(422) |> put_view(Elemental.Auth.ErrorView) |> render("422.json-api", %{data: changeset}) 或 使用JaSerializer 我越来越 (Poison.EncodeError) unable to encode value: {"has already been taken", []} 这是出乎意料的。它早就开始工作了。
conn
|> put_status(422)
|> put_view(Elemental.Auth.ErrorView)
|> render("422.json-api", %{data: changeset})
或
使用JaSerializer
我越来越
(Poison.EncodeError) unable to encode value: {"has already been taken", []}
这是出乎意料的。它早就开始工作了。
我有{:毒药,~>2.0}
更新
毒药从不知道如何使用元组。您可以轻松地将元组转换为列表:
a = {"has already been taken", []}
a
|> Tuple.to_list() # ["has already been taken", []]
|> Poison.encode!() # "[\"has already been taken\",[]]"
或者只需使用模式匹配从元组中获取第一个\u条目:
{message, _list} = {"has already been taken", []}
编辑:
试图显式显示变更集时,代码正在崩溃。避免这种情况的最佳解决方案是创建特定的视图,该视图将返回JSON,您可以在其中准备如何显示错误,例如
def render("422.json-api", %{data: data}) do
# data is actually changeset, which you are passing here
errors = Enum.map(data.errors, fn {field, message} ->
%{field: "#{field} has error: #{message}"
end)
%{errors: errors}
end
它不能对显然是变更集数据一部分的元组进行编码,您必须将其更改为可以编码的内容。@JustMichael see updatesee updates,what do you mean>,但结果表明您可能只显示第一个?好的,我编辑了我的答案。避免显式使用Poison.encode的最简单方法!就是创建一个视图,隐式地为您完成这项工作,您可以完全控制要呈现的内容。因为它是一个元组,所以我只提取并匹配了子句,并生成了输出。谢谢
{message, _list} = {"has already been taken", []}
def render("422.json-api", %{data: data}) do
# data is actually changeset, which you are passing here
errors = Enum.map(data.errors, fn {field, message} ->
%{field: "#{field} has error: #{message}"
end)
%{errors: errors}
end