Postgresql Phoenix表单验证检查未显示,但来自postgres的非空约束

Postgresql Phoenix表单验证检查未显示,但来自postgres的非空约束,postgresql,elixir,phoenix-framework,Postgresql,Elixir,Phoenix Framework,当尝试构建表单验证时,当我使用超过20个字符的用户名时,我的错误会显示在表单中,但当我不输入任何内容时,错误不会显示在表单中。我得到一个违反非空约束的Postgres.Error视图 # user.ex def changeset(model, params \\ %{}) do model |> cast(params, ~w(name username), []) |> validate_length(:username, min: 1, max: 20) end

当尝试构建表单验证时,当我使用超过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
翻阅凤凰城的编程书,不幸的是它有点过时了,我找不到一个快速解决这个问题的方法


不知何故,博士后不应该在验证检查之前到来。你知道如何消除这个错误吗?

如果它不起作用,我假设你使用的是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
您可以在的文档中查看更多详细信息


希望有帮助

您是否尝试过将
validate\u required([:username,:other\u fields])
添加到您的变更集管道中?我只是写了基本上能实现这一点的东西,我必须有点仔细,注意现在我(当然)得到了“不能为空”,而这本书显示了更合适的“应该至少为1个字符”这也是可能的。
min:
部分只是在某种程度上忽略了它的功能。当然,同样的区别,我想我可以保留额外的代码行。