Как я могу изменить проверку данных в phoenix/Elixir?

у меня нет опыта разработки, и это не мой первый язык, извините за что-либо.

Я работаю в мобильном приложении с серверной частью в 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

Я считаю, что мне нужно изменить эту функцию, чтобы позволить системе создать учетную запись без всех этих данных, и после создания учетной записи пользователь может заполнить свои данные из приложения, но я не уверен, как я могу это сделать, может кто-нибудь мне поможет?

3
0
271
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если поле не является обязательным, вы должны удалить его из 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

Все, что вам нужно сделать, это изменить вызов метода validate_required, чтобы удалить поля, которые вы хотите сделать необязательными:

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

Если вы хотите узнать больше о том, что делают эти вызовы функций, вы можете прочитать структуру Phoenix путеводитель по Экто (в частности, раздел о Наборы изменений и проверки).

Другие вопросы по теме