【Phoenix】3、Schema 的学习

  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: "[email protected]", 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    

猜你喜欢

转载自www.cnblogs.com/-xk94/p/10471635.html
今日推荐