【问题标题】:How can I change my data validation in phoenix/Elixir?如何更改 phoenix/Elixir 中的数据验证?
【发布时间】:2019-01-23 13:58:17
【问题描述】:

我没有开发经验,这不是我的第一语言,抱歉。

我正在使用 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

我认为我需要更改此功能以允许系统在没有所有这些数据的情况下创建一个帐户,并且在创建帐户后,用户可以从应用程序内完成他们的数据,但我不确定我该怎么做这个,谁能帮帮我?

【问题讨论】:

    标签: android mobile elixir phoenix-framework


    【解决方案1】:

    如果该字段不是必需的,则应将其从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
    

    【讨论】:

      【解决方案2】:

      您需要做的就是更改对validate_required 方法的调用以删除您希望成为可选的字段:

      |> validate_required([:email, :password])
      

      如果您想详细了解这些函数调用的作用,可以阅读 Phoenix 框架 guide about Ecto(特别是 Changesets and Validations 部分)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-20
        • 1970-01-01
        相关资源
        最近更新 更多