2017-01-01 18 views
0

Elixir/Ectoを学習し、チェンジセットに関連する不具合を犯しました。私が間違っていることを確信していない。Ecto Changeset、変更時に検証されない必須フィールド

私はいくつかの必須フィールドを持つ "ドメインモデル"構造体を持っています。 put_changeを実行すると、返されたチェンジセットは、チェンジセット(フィールドがない)にエラーがあります。

cset = Activity.changeset(%Activity{}, %{details: "Played in the snow", child_id: child_id}) 

#Ecto.Changeset<action: nil, 
changes: %{child_id: "ed553c30-38d2-4cb1-9029-eb2180c141cc", 
    details: "Played in the snow"}, 
errors: [relevant_date: {"can't be blank", [validation: :required]}, 
    display_time: {"can't be blank", [validation: :required]}], 
data: #MyApp.Domain.Activity<>, valid?: false> 

上記が予想される。 relevant_datedisplay_timeの両方が欠落しており、エラーが存在するはずです。

cset |> Ecto.Changeset.put_change(:relevant_date, ~D[2016-12-31]) 

#Ecto.Changeset<action: nil, 
changes: %{child_id: "ed553c30-38d2-4cb1-9029-eb2180c141cc", 
    details: "Played in the snow", relevant_date: ~D[2016-12-31]}, 
errors: [relevant_date: {"can't be blank", [validation: :required]}, 
    display_time: {"can't be blank", [validation: :required]}], 
data: #Kidgenius.Domain.Activity<>, valid?: false> 

これは意味をなさない部分です。 relevant_dateです。変更箇所にはがありますが、それでもまだ私にはrelevant_date can't be blankと伝えています。

助けていただけたら幸いです!

編集:これはEcto 2.1.1です。

答えて

2

put_changeは、更新されたチェンジセットをvalidate_requiredに渡す必要があるため、更新された状態で検証を実行しようとします。

少し問題を明確にすることを望みます!ただ、明確化のため

EDIT

# 1. 
cset = 
    Activity.changeset(
    %Activity{}, 
    %{details: "Played in the snow", child_id: child_id} 
) 

# 2. 
cset = Ecto.Changeset.put_change(cset, :relevant_date, ~D[2016-12-31]) 

# 3. This probably is something you currently have implemented 
# in your `Activity.changeset`, most likely as second setep 
# after `Ecto.cast/3`. 
cset = Ecto.Changeset.validate_required(cset, [:relevant_date]) 
+0

ありがとう!これは私の質問に答えます。 'validate_required'を実行すると、チェンジセットの他のすべての検証も実行されますか?データを変更したら、チェンジセットのバリデーションを「再実行」するための慣用的な方法はありますか? – Brandon

+0

喜んで助けてください!あなたの質問に関しては、全てのバリデーションルールを( 'validate'のような)別々の関数に抽出することで取り組むことができます。それは' changeset'を受け入れます。 Elixir/Ectoの素晴らしい点は、あなたが必要としているものを簡単な機能で構成できることです。それを活用してください! –

関連する問題