当我尝试构建表单验证时,当我使用超过20个字符的用户名时,我的错误会显示在表单中,但是当我输入任何内容时都不会。我得到违反非空约束 Postgres.Error视图。
# user.ex
def changeset(model, params \\ %{}) do
model
|> cast(params, ~w(name username), [])
|> validate_length(:username, min: 1, max: 20)
end
这可能是因为迁移:
def change do
create table(:users) do
add :name, :string
add :username, :string, null: false
add :password_hash, :string
timestamps
end
create unique_index(:users, [:username])
end
通过编程凤凰书,不幸的是有点过时,我找不到这个问题的快速解决方案。
不知何故,Postgres不应该在验证检查之前到来。如何解决这个错误的想法消失了?
答案 0 :(得分:1)
如果它不起作用,我假设您使用的是Phoenix 1.3,请尝试更改此代码
def changeset(model, params \\ %{}) do
model
|> cast(params, ~w(name username), [])
|> validate_length(:username, min: 1, max: 20)
end
有了这个:
def changeset(model, params \\ %{}) do
model
|> cast(params, ~w(name username))
|> validate_required([:username])
|> validate_length(:username, min: 1, max: 20)
end
您可以在Ecto.Changeset.validate_required/3
的文档中查看更多详细信息。
希望有所帮助!