2017-10-31 5 views
0

無効なチェンジセットを返そうとしています。Poison.EncodeErrorは値をエンコードできません:{"has already taken"、[]}

conn 
|> put_status(422) 
|> put_view(Elemental.Auth.ErrorView) 
|> render("422.json-api", %{data: changeset}) 

OR

JaSerializer を使用して
conn 
|> put_status(422) 
|> put_view(Elemental.Auth.ErrorView) 
|> render(:errors, data: changeset) 

を行う場合

私は、これは予想外であった

(Poison.EncodeError) unable to encode value: {"has already been taken", []} 

を取得しています。それは早く働いていた。 は私が{:poison, "~> 2.0"},

UPDATE

>> d 
%{errors: [shortcode: {"has invalid format", [validation: :format]}]} 
iex(11)> Map.replace(d, :errors, [shortcode: Tuple.to_list(shortcode)]) |> Poison.encode 
{:error, 
{:invalid, {:shortcode, ["has invalid format", [validation: :format]]}}} 
+0

明らかに変更セットデータの一部であるタプルをエンコードできません。エンコードできるものに変更する必要があります。 – JustMichael

+0

@JustMichael更新を参照 – user2290820

答えて

1

毒はタプルをencodeする方法を知っていたことがありません。あなたは簡単にリストにタプルを変換することができます:

a = {"has already been taken", []} 

a 
|> Tuple.to_list() # ["has already been taken", []] 
|> Poison.encode!() # "[\"has already been taken\",[]]" 

それとも単にパターンマッチングを使用して、タプルからFIRST_ENTRY取得:

{message, _list} = {"has already been taken", []} 

編集

表示しようとしたときにあなたのコードがクラッシュします明示的にはchangesetです。これを避ける最良の解決策は、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 
+0

アップデートを参照してください、あなたは何を意味するのですか?>しかし、最初のものだけを表示することが判明しましたか? – user2290820

+0

私は自分の答えを編集しました。明示的に 'Poison.encode! 'を使わないのが一番簡単な方法は、暗黙のうちにあなたのために行うViewを作成することです。それがタプルだったので – PatNowak

+0

、私はちょうど抽出し、句に一致し、出力を得ました。ありがとう – user2290820

関連する問題