これだけは知っておけ！Phoenix validation メソッド

# 概要

Phoenix において、validation に関するメソッドを紹介。
Phoenix は changeset において、validation や filtering を行っています。

> Changesets allow filtering, casting, validation and definition of constraints when manipulating structs.
ref. [Ecto.Changeset](https://hexdocs.pm/ecto/Ecto.Changeset.html)

その changeset の役割の一つである validation に関するメソッドを紹介します。

ref. [Function | Ecto.Changeset](https://hexdocs.pm/ecto/Ecto.Changeset.html#functions)

# [validate_required](https://hexdocs.pm/ecto/Ecto.Changeset.html#validate_required/3) | nil や空白文字不可

```elixir

validate_required(changeset, fields, opts \\ [])

```

入力必須項目を作る際に使います。
対象とする　filed を第二引数にします。複数ある場合は、リストで渡します。

```elixir

validate_required(changeset, :title)
validate_required(changeset, [:title, :body])

```

# [validate_format](https://hexdocs.pm/ecto/Ecto.Changeset.html#validate_format/4) | 特定のフォーマットを指定

```elixir

validate_format(changeset, field, format, opts \\ [])

```

メールアドレスなど文字列に規則性のあるものに対して使用します。
第三引数に、正規表現を渡します。そのパターンにマッチしない場合は、保存できません。

```elixir

validate_format(changeset, :email, ~r/@/)

```

# [validate_length](https://hexdocs.pm/ecto/Ecto.Changeset.html#validate_length/3) | リストや文字列の長さを指定

```elixir

validate_length(changeset, field, opts)

```

リストや文字列の長さを指定することができます。
min, max, is のいずれかの option を指定する必要があります。
文字列だけではなくて、リストの length に対しても有効に使用できます。

```elixir 

validate_length(changeset, :title, min: 3)
validate_length(changeset, :title, max: 100)
validate_length(changeset, :title, min: 3, max: 100)

```

# [validate_number](https://hexdocs.pm/ecto/Ecto.Changeset.html#validate_number/3) | 数字の大きさを指定

```elixir
validate_number(changeset, field, opts)
```

数字の大きさを指定することができます。特定の数より大きいや小さい、あるいは等しいなど。
validate_length 同様に、option を指定する必要があります。

```elixir

validate_number(changeset, :count, less_than: 3)
validate_number(changeset, :pi, greater_than: 3, less_than: 4)
validate_number(changeset, :radius, equal_to: 42)

```

## option

- `:less_than`
    - 指定する数字より小さく
- `:greater_than`
    - 指定する数字より大きく
- `:less_than_or_equal_to`
    - 指定する数字以下
- `:greater_than_or_equal_to`
    - 指定する数字以上
- `:equal_to`
    - 指定した数字と等しく

# [validate_inclusion](https://hexdocs.pm/ecto/Ecto.Changeset.html#validate_inclusion/4) | 列挙された値に合致するかチェック

```elixir
validate_length(changeset, field, opts)
```

列挙された値のいずれかと合致するかチェック。
第三引数にリストを渡します。その値以外のものを保存することができなくなります。

```elixir

validate_inclusion(changeset, :gender, ["man", "woman", "other", "prefer not to say"])
validate_inclusion(changeset, :age, 0..99)

```

# [validate_exclusion](https://hexdocs.pm/ecto/Ecto.Changeset.html#validate_exclusion/4) | 列挙された値に合致しないかチェック

```elixir
validate_exclusion(changeset, field, data, opts \\ [])
```

validate_inclusion の逆です。列挙された値のいずれかと合致しないかをチェック。
以下のように使用します。 `:name` が `admin` や `superadmin` の場合、invalid になります。

```elixir
validate_exclusion(changeset, :name, ~w(admin superadmin))
```


# [validate_acceptance](https://hexdocs.pm/ecto/Ecto.Changeset.html#validate_acceptance/3) | true になっているかチェック

```elixir 
validate_acceptance(changeset, field, opts \\ [])
```

利用規約などチェックボックスにチェックが入ってるか確認するために利用します。
指定した field が true になっていなければ invalid になります。

```elixir
validate_acceptance(changeset, :terms_of_service)
```

# [validate_confirmation](https://hexdocs.pm/ecto/Ecto.Changeset.html#validate_confirmation/3) | 値が同じかチェック

```elixir
validate_confirmation(changeset, field, opts \\ [])
```

メールアドレスなど確認のために二度入力した項目が同じになっているか確認するためのものです。

```elixir
validate_confirmation(changeset, :email)
```

以上のように使うことで、 `email` と `email_confirmation` が同じであるかチェックしてくれます。