【问题标题】:How To Modify Value In Changeset - Elixir?如何修改变更集中的值 - Elixir?
【发布时间】:2017-04-03 00:11:22
【问题描述】:

我是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 和 phone 存储在不同的列中,而是尝试将 e164 格式数字存储到我的数据库中,所以我在检查 changeset 后修改了 e156_number = ExPhoneNumber.format(phone_number, :e164) 中的数字 phone number is valid。当我尝试更新 @ 987654331@ in struct like follow %{struct | phone: e156_number} value 没有更新,而是存储从表单 %{phone: '97989*****'} 返回的值,我在这里犯了什么错误,如何在变更集中删除 countryCode?​​p>

【问题讨论】:

  • 尝试put_change(struct, :phone, e156_number),而不是像那样更新结构。
  • @Dogbert 即使我使用put_change(struct, :phone, e156_number) 也没有反映,即使我尝试了force_change 也没有变化
  • 您需要用 put_change(...) 替换这两行:%{struct | phone: e156_number} 和 struct。我想你可能只替换了第一行。
  • @Dogbert 它的作品,非常感谢你。即使我使用delete_change删除国家代码
  • @W.M.正确的。我只修改了模型类内部

标签: elixir phoenix-framework


【解决方案1】:

要修改变更集中的值,您应该使用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 会更好该变量的名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多