Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 如何添加条件必填字段?_Elixir_Phoenix Framework_Ecto - Fatal编程技术网

Elixir 如何添加条件必填字段?

Elixir 如何添加条件必填字段?,elixir,phoenix-framework,ecto,Elixir,Phoenix Framework,Ecto,我有一个地址的EXTO模型(简化)模式: 我想将zip标记为所需,而不是可选,但前提是国家/地区在白名单中,但我无法找到一种干净的方法来编写验证。如何添加该约束?没有明确的函数要求在cast之外添加字段。您可以使用该函数并覆盖“:message”选项 validate_length(changeset, :zip, min: 1, message: "is required when country is US") 您也可以简单地定义多个强制转换: def changeset(model, p

我有一个地址的EXTO模型(简化)模式:


我想将
zip
标记为所需,而不是可选,但前提是国家/地区在白名单中,但我无法找到一种干净的方法来编写验证。如何添加该约束?

没有明确的函数要求在
cast
之外添加字段。您可以使用该函数并覆盖“:message”选项

validate_length(changeset, :zip, min: 1, message: "is required when country is US")

您也可以简单地定义多个强制转换:

def changeset(model, params \\ :empty) do
  model
  |> cast(params, ~w(country), ~w())
  |> cast_by_country(params)
end

defp cast_by_country(changeset, params) do
  case get_field(changeset, :country) do
    "US" -> cast(changeset, params, ~w(zip), ~w())
    _    -> cast(changeset, params, ~w(), ~w(zip))
  end
end
get_field/2
将从更改中读取一个值,如果没有,则返回到struct one。这是变更集的最大好处:它只是数据结构,您可以使用常规的Elixir代码进行条件检查、验证等。直接进行写、读和测试。:)

def changeset(model, params \\ :empty) do
  model
  |> cast(params, ~w(country), ~w())
  |> cast_by_country(params)
end

defp cast_by_country(changeset, params) do
  case get_field(changeset, :country) do
    "US" -> cast(changeset, params, ~w(zip), ~w())
    _    -> cast(changeset, params, ~w(), ~w(zip))
  end
end