【发布时间】: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.正确的。我只修改了模型类内部