我没有开发经验,这不是我的母语,对不起。
我正在使用后端在Elixir / Phoenix中的移动应用程序,当一个人想要创建一个新帐户时,系统需要5条信息来创建一个新帐户(电子邮件,cpf,名称,电话号码,密码) 。
在新的注册流程中,我只想请求2个数据(电子邮件和密码),以后使用该应用程序,用户可以填写丢失的数据,因此我的系统必须能够创建一个该数据为空的帐户。
首先,我进入结构数据库以检查是否不允许数据为空,如何看待它没有发生:
CREATE TABLE users (
id bigint NOT NULL,
email character varying(255),
cpf character varying(255),
phone_number character varying(255),
password character varying(255),
inserted_at timestamp without time zone NOT NULL,
updated_at timestamp without time zone NOT NULL,
name character varying(255)
);
所以我去检查了user.ex文件,看看执行数据验证的函数是否不允许它们为空,而我发现了这一点:
def changeset(%User{} = user, attrs) do
user
|> cast(attrs, [:email, :cpf, :name, :phone_number, :password])
|> validate_required([:email, :cpf, :name, :phone_number, :password])
|> validate_format(:email, ~r/^[A-Za-z0-9._%+-+']+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/)
|> validate_format(:cpf, ~r/([0-9]{2}[\.]?[0-9]{3}[\.]?[0-9]{3}[\/]?[0-9]{4}[-]?[0-9]{2})|([0-9]{3}[\.]?[0-9]{3}[\.]?[0-9]{3}[-]?[0-9]{2})/)
|> validate_cpf(:cpf)
|> unique_constraint(:email)
|> unique_constraint(:cpf)
|> unique_constraint(:phone_number)
|> update_password_hash()
|> update_activation_code()
end
我相信我需要更改此功能,以允许系统创建一个没有所有这些数据的帐户,并且在创建帐户之后,用户可以从应用程序内完成其数据,但是我不确定该怎么做这个,有人可以帮我吗?
答案 0 :(得分:3)
如果不需要该字段,则应将其从validate_required中删除。
所以您的变更集功能应该变成
def changeset(%User{} = user, attrs) do
user
|> cast(attrs, [:email, :cpf, :name, :phone_number, :password])
|> validate_required([:email, :password])
|> validate_format(:email, ~r/^[A-Za-z0-9._%+-+']+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/)
|> validate_format(:cpf, ~r/([0-9]{2}[\.]?[0-9]{3}[\.]?[0-9]{3}[\/]?[0-9]{4}[-]?[0-9]{2})|([0-9]{3}[\.]?[0-9]{3}[\.]?[0-9]{3}[-]?[0-9]{2})/)
|> validate_cpf(:cpf)
|> unique_constraint(:email)
|> unique_constraint(:cpf)
|> unique_constraint(:phone_number)
|> update_password_hash()
|> update_activation_code()
end
答案 1 :(得分:2)
所有您需要做的就是将对validate_required
方法的调用更改为删除您想要为可选字段的字段:
|> validate_required([:email, :password])
如果您想详细了解这些函数调用的功能,可以阅读Phoenix框架guide about Ecto(特别是Changesets and Validations的部分)。