2017-03-14 5 views
0

レコードが存在しない場合、この条件付きで作成することが期待されますが、.... nilが返されません。エリクシール、Ectoパターンがdbクエリと条件付きで一致しません。

case Repo.get_by(User, %{email: "[email protected]"}) do 
    struct -> 
     struct 
    nil -> 
     params = Map.merge(%{email: "[email protected]"}, %{password: "password"}) 
     Repo.insert!(User.changeset(User.__struct__, params)) 
end 

# returns nil.... huwutt??? 

ただし、条件の順序を変更すると動作します。私はここで何が欠けていますか?

case Repo.get_by(User, %{email: "[email protected]"}) do 
    nil -> 
     params = Map.merge(%{email: "[email protected]"}, %{password: "password"}) 
     Repo.insert!(User.changeset(User.__struct__, params)) 
    struct -> 
     struct 
end 

# returns a set of 24" pythons, brother.... huzah! 
+0

最初の例では、ガードを提供していないため、最初のケースが常に一致します。したがって、 'struct'は' nil'にバインドされます – AbM

答えて

2

documentation

caseによると、我々は一致するものを見つける まで、私たちは多くのパターンに対して値を比較することができます:最初に一致した場合、

別の言葉でます実行し、caseはさらに進まないでしょう。

最初の例では、あなたがガードを提供していないため、最初のケースは常に一致し、structnilにバインドされます。 2番目の方法は、最初に特定のパターンに一致するパターンを作成してから、caseの評価をstructにバインドして、一般的なケースにデフォルト設定するため、この問題を解決します。

はまた、あなたがhereを概説mapとしてstructの値であることを確認するためにあなたの最初のケースでガードを使用できることに注意してください。

関連する問題