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?
source to share
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.
source to share