Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir Poison.EncodeError无法对值进行编码:{“已采取”,[]}_Elixir_Phoenix Framework_Elixir Poison - Fatal编程技术网

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