【问题标题】:Ecto Changeset, required fields not validating on changesEcto Changeset,必填字段未验证更改
【发布时间】:2017-01-01 21:06:56
【问题描述】:

学习 Elixir/Ecto,并遇到了与变更集相关的障碍。不知道我做错了什么。

我有一个“域模型”结构,其中包含一些必填字段。当我执行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

【问题讨论】:

    标签: elixir ecto changeset


    【解决方案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])
    

    【讨论】:

    • 谢谢!这确实回答了我的问题。运行validate_required 是否还会在变更集上运行所有其他验证?更改数据后,是否有一种惯用的方法可以在变更集上“重新运行”验证?
    • 很高兴为您提供帮助!关于您的问题 - 您可以通过将所有验证规则提取到单独的函数(如 validate)来解决这个问题,这将接受 changeset,您可以通过所有 验证函数,如果那讲得通。 Elixir/Ecto 的伟大之处在于你可以用简单的函数来组合你需要的任何东西。好好利用吧!
    猜你喜欢
    • 1970-01-01
    • 2017-06-24
    • 2012-05-23
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多