How to change a value in a changeset - elixir?

I'm new to phoenix framework

, will say I have a model like follow with changeset

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

      

params from the form looks like %{name: 'elixir', countryCode: 'IN', phone: '97989*****'}

I am currently using ex_phone_number to validate my phone number, my custom validator valid_phone_number

looks like this

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

      

Instead of storing the country code and phone number in a differnt column, I am trying to store the format number e164

in my database, so I change the number e156_number = ExPhoneNumber.format(phone_number, :e164)

in changeset

after checking phone number is valid

. When I try to update phone

in a struct like follow the %{struct | phone: e156_number}

value is not updated, instead it keeps the value returned from the form %{phone: '97989*****'}

, what mistake did I make here and how can I remove the countryCode in the changeset as well?

+3


source to share


1 answer


To change a value in a changeset, you must use Ecto.Changeset.put_change/3

. So yours if

should look like this:

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

      



Sidenote: valid_phone_number

here actually gets Ecto.Changeset

, not the Struct model (technically Ecto.Changeset

also Elixir Struct, but it's not your structure User

), so a changeset

better name for this variable would be.

+4


source







All Articles