elixir - 如何修改 Changeset 中的值 - Elixir?

标签 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

表单中的参数看起来像 %{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

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

最佳答案

要修改变更集中的值,您应该使用 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

旁注:valid_phone_number这里实际上是收到一个 Ecto.Changeset ,不是模型结构(技术上 Ecto.Changeset 也是 Elixir 结构,但它不是您的 User 结构),所以 changeset将是该变量的更好名称。

关于elixir - 如何修改 Changeset 中的值 - Elixir?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43153755/

相关文章:

ruby - Elixir:String Force encode UTF-8

elixir - Elixir :模式匹配或守卫

postgresql - 设置 Phoenix Framework 和 Ecto 以使用 UUID : how to insert the generated value?

phoenix-framework - 在Elixir/Phoenix中渲染 “OK”的最简单方法是什么?

elixir - Phoenix 中如何创建 View 属性?

ubuntu - 如何使用 upstart 可靠地管理 phoenix 应用程序

elixir - 在 Elixir 列表中,如何获得中间值?

elixir - 变更集中的字段的默认值

elixir - Phoenix Controller 操作后如何获取 conn 结构

elixir - 在 phoenix 中实现 highlight.js 的正确方法是什么?