# 画面設計書 46-ユーザー検証画面

## 概要

本ドキュメントは、Fizzyアプリケーションにおけるユーザー検証画面の設計仕様を定義したものです。新規ユーザーの検証（メールアドレス所有者の確認）を行う中間画面について記載しています。

### 本画面の処理概要

本画面は、新規ユーザーがマジックリンクでサインインした後、メールアドレスの所有者であることを検証し、ユーザー参加画面（No.45）へ遷移するための中間画面です。自動送信フォームにより、ユーザーの操作なしで検証処理が完了するよう設計されています。

**業務上の目的・背景**：Fizzyでは参加コードを使用した新規ユーザーの招待フローにおいて、マジックリンクでサインインしたユーザーが本当にそのメールアドレスの所有者であることを確認する必要があります。本画面はこの検証プロセスを自動的に完了し、ユーザーをスムーズに次のステップ（名前設定）へ誘導します。

**画面へのアクセス方法**：参加コードによるサインアップフローにおいて、マジックリンクでサインイン後に自動的に遷移します。URLは`/users/verifications/new`です。

**主要な操作・処理内容**：
1. 画面表示と同時に自動送信フォームがトリガーされる
2. Current.userのverify処理が実行される
3. ユーザー参加画面（No.45）にリダイレクトされる

**画面遷移**：
- 遷移元：マジックリンクからのサインイン
- 遷移先：ユーザー参加画面（No.45）

**権限による表示制御**：本画面は認証済みユーザーのみアクセス可能です。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 66 | ユーザー名編集 | 主機能 | ユーザー検証を行い名前を設定 |

## 画面種別

確認（自動処理）

## URL/ルーティング

- パス: `/users/verifications/new`
- HTTPメソッド: GET（表示）/ POST（検証処理）
- ルート名: `new_users_verification_path` / `users_verifications_path`
- コントローラ: `Users::VerificationsController#new` / `#create`
- レイアウト: `public`

## 入出力項目

本画面には入力項目はありません。自動送信フォームが使用されます。

## 表示項目

| 項目名 | 説明 | 表示条件 |
|--------|------|----------|
| 自動送信フォーム | 非表示の自動送信フォーム | 常時 |

※本画面は自動遷移のための中間画面であり、表示コンテンツは最小限です。

## イベント仕様

### 1-画面表示時（自動送信）

画面が表示されると、`auto_submit_form_with`ヘルパーにより自動的にフォームが送信されます。これにより、ユーザーの追加操作なしで検証処理が開始されます。

### 2-フォーム送信処理

フォーム送信時、以下の処理が実行されます：
1. POSTリクエストが`users_verifications_path`に送信される
2. `Current.user.verify`が呼び出され、ユーザーが検証済みになる
3. ユーザー参加画面（`new_users_join_path`）にリダイレクトされる

## データベース更新仕様

### 操作別データベース影響一覧

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| フォーム送信 | users | UPDATE | ユーザーのverified_atを更新 |

### テーブル別更新項目詳細

#### users

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| UPDATE | verified_at | 現在時刻（Time.current） | verified?がfalseの場合のみ更新 |
| UPDATE | updated_at | 現在時刻 | - |

## メッセージ仕様

本画面には表示メッセージはありません。

## 例外処理

| 例外ケース | 対応 |
|-----------|------|
| 認証されていない | ログイン画面へリダイレクト |

## 備考

- レイアウトは「public」が使用される
- `auto_submit_form_with`ヘルパーによる自動送信を使用
- ユーザーが既に検証済み（`verified_at`が設定済み）の場合、`verify`メソッドは何もしない
- 本画面は瞬間的に表示されるのみで、すぐに次の画面へ遷移する

---

## コードリーディングガイド

本画面を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

検証処理に関わるモデルの構造を理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | user.rb | `app/models/user.rb` | verify/verified?メソッドの実装を確認 |

**読解のコツ**: `verify`メソッドは`verified_at`がnilの場合のみ更新を行います。冪等性が保証されています。

#### Step 2: エントリーポイントを理解する

処理の起点となるコントローラを特定します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | verifications_controller.rb | `app/controllers/users/verifications_controller.rb` | newとcreateアクションの実装を確認 |

**主要処理フロー**:
1. **行2**: `layout "public"` - publicレイアウトの使用
2. **行4-5**: `new`アクション - ビューをレンダリング
3. **行7-9**: `create`アクション - 検証処理とリダイレクト
4. **行8**: `Current.user.verify` - ユーザーを検証済みにする
5. **行9**: `redirect_to new_users_join_path` - 次の画面へリダイレクト

#### Step 3: ビューテンプレートを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | new.html.erb | `app/views/users/verifications/new.html.erb` | 自動送信フォームの構造を確認 |

**主要処理フロー**:
- **行1**: `auto_submit_form_with`ヘルパーによる自動送信フォーム

#### Step 4: 検証ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | user.rb | `app/models/user.rb` | verify/verified?メソッドの詳細 |

**主要処理フロー**:
- **行32-33**: `verified?` - verified_atが存在するかチェック
- **行35-37**: `verify` - verified?がfalseの場合のみverified_atを更新

### プログラム呼び出し階層図

```
Users::VerificationsController#new
    │
    └─ new.html.erb レンダリング
           │
           └─ auto_submit_form_with ──▶ フォーム自動送信

Users::VerificationsController#create
    │
    ├─ Current.user.verify
    │      │
    │      ├─ verified? チェック
    │      │
    │      └─ update!(verified_at: Time.current)
    │         （未検証の場合のみ）
    │
    └─ redirect_to new_users_join_path
```

### データフロー図

```
[入力]                      [処理]                           [出力]

（自動送信）           VerificationsController#create
    ───────────▶            │
                            ├─▶ Current.user.verify
                            │      │
                            │      └─▶ users.verified_at 更新
                            │
                            └─▶ redirect_to ──────────────▶ ユーザー参加画面
                                new_users_join_path            (No.45)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| verifications_controller.rb | `app/controllers/users/verifications_controller.rb` | コントローラ | 画面制御・検証処理 |
| new.html.erb | `app/views/users/verifications/new.html.erb` | ビュー | 自動送信フォームの表示 |
| user.rb | `app/models/user.rb` | モデル | verify/verified?メソッド |
| routes.rb | `config/routes.rb` | 設定 | ルーティング定義（行151） |
