1、我们切到 hello 目录下,在这个文件夹的根路径打开 终端/cmd。
2、在之前的文章中,我们已经通过命令创建了一个 users 数据表。如果没有,请翻回之前的查看怎么创建。
3、我们可以在下图中,看到 ecto 帮我们创建的 文件内容 如下:(这是简单的 Elixir 结构)
4、下面,我们来了解 schema 中的字段的用法,在官网中的大概意思是,schema 中的 changeset 和 validations 是用来做验证的,也是用户的输入 的内容做验证,验证通过了才会插入到数据之类的功能吧,如下:
// %User{} = user 这个 跟上图有点区别,但其实功能什么都是一样的。 def changeset(%User{} = user, attrs) do user |> cast(attrs, [:name, :email, :bio, :number_of_pets]) |> validate_required([:name, :email, :bio, :number_of_pets]) end
5、刚刚 我们在 hello 的根目录下打开了 终端/cmd,现在我们用一下命令进入到 Elixir 的运行环境中
// 像执行 mix 服务一样进入(-S 中的 S 要大写),我个人是这样认为的 $ iex -S mix // 进入到 名为 user 的 schema 中,这一步必须进入,不然我们下面调用不到 User 这个 schema。(大概就这个意思了,有错欢迎提出)。 iex> alias Hello.User
6、输入 iex> 后面的命令: changeset = User.changeset(%User{}, %{});
// %{} 这传入的变化集,%User{} 这个,应该是调用那个验证。 iex> changeset = User.changeset(%User{}, %{}) // 下面是输出的信息,我们上面提交了空白的集合,下面的错误提示,就是不能为空白 #Ecto.Changeset<action: nil, changes: %{}, errors: [name: {"can‘t be blank", [validation: :required]}, email: {"can‘t be blank", [validation: :required]}, bio: {"can‘t be blank", [validation: :required]}, number_of_pets: {"can‘t be blank", [validation: :required]}], data: #Hello.User<>, valid?: false>
7、当我们有了变更集,我们就可以查看 它 是否有效,无效返回的是 false,有效返回的是 true。
// changeset 是我们上面定义的值(在 Elixir 中,好像不能说定义,具体自己看 Elixir 的语法) // valid? 中的 ? 号要带上 iex> changeset.valid?
8、接下来我们把 user.ex 文件中 validate_required 中的 :number_of_pets 删掉,再进行验证,验证之前,重新加载一下:
iex> recompile()
9、再验证
iex> changeset = User.changeset(%User{}, %{}) // 我们可以看到下面的报错信息,少了 number_of_pets 这个字段的报错 #Ecto.Changeset<action: nil, changes: %{}, errors: [name: {"can‘t be blank", [validation: :required]}, email: {"can‘t be blank", [validation: :required]}, bio: {"can‘t be blank", [validation: :required]}], data: #Hello.User<>, valid?: false>
10、我们 定义一个 集合 去进行验证,这里会额外定义一个不存在 在 User 这个 schema 中的字段。
iex> params = %{name: "Joe Example", email: "joe@example.com", bio: "An example to all", number_of_pets: 5, random_key: "random value"}
11、使用上面的字段,进行验证,是可以通过验证的,自己使用 valid? 查看
iex> changeset = User.changeset(%User{}, params)
12、但我们 查看到变化的值有哪些,其中不包括 额外的值 random_key,因为在验证的时候,已经把它移除了。
13、我们知道 validate_required 是 验证数据是否为空的,下面还有是验证其他规则的(更多规则):
def changeset(%User{} = user, attrs) do user |> cast(attrs, [:name, :email, :bio, :number_of_pets]) |> validate_required([:name, :email, :bio, :number_of_pets]) // 验证 bio 中的值的长度,不能少于 2 |> validate_length(:bio, min: 2) // 验证 bio 中的值得长度,不能大于140 |> validate_length(:bio, max: 140) // 验证 email 中 @ 这个符号要存在。 |> validate_format(:email, ~r/@/) end
原文地址:https://www.cnblogs.com/-xk94/p/10471635.html