我是phoenix framework
的新手,让我说我有一个模型,如Follows 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
表单中的参数看起来像
%{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
格式编号存储到我的数据库中,以便在检查e156_number = ExPhoneNumber.format(phone_number, :e164)
后修改changeset
中的phone number is valid
编号。存储从phone
表单返回的值,我在这里犯了什么错误,以及如何在changeset中删除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
,而不是模型Struct(从技术上讲Ecto.Changeset
也是Elixir Struct,但它不是您的User
结构),因此changeset
将是该变量的更好名称。关于elixir - 如何在变更集中-Elixir修改值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43153755/