У меня есть update_changeset, в котором я хочу предотвратить запись значений nil.
Я пытался добавить validate_change
def update_changeset(user, attrs) do
user
|> cast(attrs, [:full_name])
|> validate_change(:full_name, fn :full_name, full_name ->
if full_name == nil do
[full_name: "cannot be blank"]
else
[]
end
end)
end
Но поскольку он вызывается только тогда, когда присутствует ненулевое значение, он все равно позволяет мне записать в базу данных full_name: nil.
Как я могу заставить это работать?
Обновлено: вот как я реализовал с помощью товарищей:
defp prevent_empty(changeset, fields) do
Enum.reduce(fields, changeset, fn field, changeset ->
value = get_field(changeset, field)
if value in ["", nil] do
add_error(changeset, field, "cannot be empty or blank")
else
changeset
end
end)
end





Попробуйте использовать validate_required/3.
Если значение поля равно нулю или это строка, состоящая только из пробелов, набор изменений помечается как недействительный, поле удаляется из изменения набора изменений, и добавляется ошибка.
def update_changeset(user, attrs) do
user
|> cast(attrs, [:full_name])
|> validate_required([:full_name])
end
Итак, вы хотите разрешить пустой "", но не nil?
Да, я хочу, чтобы оба не были допущены. В принципе, он не может быть пустым для обновлений.
Попался - взгляните на ответ Алексея. Иногда приходится прокручивать собственные манипуляции с %Changeset{}
Приходится обрабатывать вручную, с помощью Ecto.Changeset.add_error/4.
def update_changeset(user, %{full_name: fn} = attrs) do
user
|> cast(attrs, [:full_name])
|> prevent_empty_full_name()
end
defp prevent_empty_full_name(%{changes: %{full_name: full_name}} = changeset)
when full_name in ["", nil],
do: add_error(changeset, :full_name, "empty")
defp prevent_empty_full_name(changeset),
do: changeset
Спасибо! Я обновлю свой исходный вопрос своим окончательным решением, которое я буду использовать, которое будет содержать несколько полей в виде списка :)
Спасибо, но проблема в том, что я хочу иметь возможность отправлять полезную нагрузку обновления, не имея :full_name. С
validate_requiredэто поле становится обязательным. Я только хочу проверить, что он не может быть установлен наnil.