如何修改变更集中的值 - Elixir?

Har*_*han 3 elixir phoenix-framework

我是新手phoenix framework,让我说我有一个类似跟随变更集的模型

schema "users" do
 field :name, :string
 field :email, :string
 field :countryCode, :string
 field :phone, :string
end

def changeset_user_register(struct, params \\%{}) do
  struct
  |> cast(params, [:name, :email, :countryCode, :phone])
  |> validate_required(:name, [message: "Name Must Not Be Empty"])
  |> validate_required(:countryCode, [message: "countryCode Must Not Be Empty"])
  |> validate_required(:phone, [message: "Phone Number Must Not Be Empty"])
  |> valid_phone_number
end
Run Code Online (Sandbox Code Playgroud)

表格中的参数看起来像 %{name: 'elixir', countryCode: 'IN', phone: '97989*****'}

我目前正在使用ex_phone_number来验证电话号码,我的自定义验证器valid_phone_number如下所示

defp valid_phone_number(struct) do
countryCode = get_field(struct, :countryCode) #get_field used to get values from struct
phone = get_field(struct, :phone)
case ExPhoneNumber.parse(phone, countryCode) do
  {:ok, phone_number} ->
    if ExPhoneNumber.is_valid_number?(phone_number) do
      e156_number = ExPhoneNumber.format(phone_number, :e164)
      %{struct | phone: e156_number}
      struct
    else
      add_error(struct, :phone, "Invalid Phone Number")
    end
  {:error, phone_number}->
    struct
 end
end
Run Code Online (Sandbox Code Playgroud)

我没有将countryCode和phone存储在不同的列中,而是尝试将e164格式编号存储到我的数据库中,因此我在检查后修改了数字e156_number = ExPhoneNumber.format(phone_number, :e164).当我尝试在struct中更新时,如果后续值不更新而是存储从表单返回的值,我在这里犯了什么错误,如何在变更集中删除countryCode?changesetphone number is validphone%{struct | phone: e156_number}%{phone: '97989*****'}

Dog*_*ert 6

要修改变更集中的值,您应该使用Ecto.Changeset.put_change/3.所以,你if应该看起来像:

if ExPhoneNumber.is_valid_number?(phone_number) do
  e156_number = ExPhoneNumber.format(phone_number, :e164)
  put_change(struct, :phone, e156_number)
else
  add_error(struct, :phone, "Invalid Phone Number")
end
Run Code Online (Sandbox Code Playgroud)

旁注:valid_phone_number这里实际上是接收一个Ecto.Changeset,而不是模型Struct(技术上Ecto.Changeset也是一个Elixir Struct,但它不是你的User结构),所以changeset这个变量的名字会更好.