Elixir Ecto变更集或验证

时间:2017-11-30 16:45:08

标签: validation elixir ecto

我正在尝试对电子邮件或电话号码执行变更集验证,我在@Dogbert here找到了一个漂亮的OR变更集功能 - 但我无法让我的OR验证流程正常工作。< / p>

有人介意快速查看为何电子邮件或电话验证始终返回usermanager.GetClaimsAsync变更集吗?

ALTER PROCEDURE GetRe
     (@a INT, @b INT)
AS
BEGIN
    DECLARE @Sum INT
    SET @Sum = @a + @B

    SELECT TOP @Sum * 
    FROM Customer
END

提前致谢!

1 个答案:

答案 0 :(得分:1)

您未在validate_required_inclusion_format中正确返回修改后的变更集。在Elixir中,块中的最后一个值是其返回值。在if语句中,true和false分支的最后一个值是它的返回值。如果您没有else分支且条件为false,则返回值为nil

以下是解决问题的最简单方法:使用if加入两个顶级changeset和后退||

defp validate_required_inclusion_format(changeset, fields) do
  if Enum.member?(fields, :email) do
    value = get_field(changeset, :email)
    if value && value != "" do
      IO.inspect(value, label: "email found: ")
      changeset
      |> email_changeset()
    end
  end || # <- note this
  if Enum.member?(fields, :phone) do
    value = get_field(changeset, :phone)
    if value && value != "" do
      IO.inspect(value, label: "phone found: ")
      changeset
      |> phone_changeset()
    end
  end || # <- and this
  changeset
end

现在,如果未满足第一个或第二个if条件,您将获得nil,并且将评估第三个if。如果第三个或第四个也未满足,则将返回最终后备changeset

注意:此功能的命名具有误导性。与您之前的答案中使用的功能不同,您在这里根本不使用fields。最好不要将fields传递给此函数,并将其称为add_email_or_phone_changeset,例如

if value = get_field(changeset, :email) do
   ...
end ||
if value = get_field(changeset, :phone) do
   ...
end || ...