Ecto Changeset,必填字段未验证更改
Ecto Changeset, required fields not validating on changes
正在学习 Elixir/Ecto,并且遇到了与变更集相关的障碍。不确定我做错了什么。
我有一个 "domain model" 结构,其中包含一些必填字段。当我执行 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_date
和 display_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
。
put_change
不执行验证,您需要通过 validate_required
传递更新的变更集,因此它将尝试对您的更新状态执行验证。
希望能稍微澄清问题!
编辑
澄清一下:
# 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])
正在学习 Elixir/Ecto,并且遇到了与变更集相关的障碍。不确定我做错了什么。
我有一个 "domain model" 结构,其中包含一些必填字段。当我执行 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_date
和 display_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
。
put_change
不执行验证,您需要通过 validate_required
传递更新的变更集,因此它将尝试对您的更新状态执行验证。
希望能稍微澄清问题!
编辑
澄清一下:
# 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])