# 画面設計書 10-テンプレート未検出画面

## 概要

本ドキュメントは、Ruby on Rails フレームワークにおけるテンプレート未検出画面の画面設計を定義するものである。

### 本画面の処理概要

本画面は、Action Viewがビューテンプレートを見つけられない場合に表示されるエラー画面である。ActionView::MissingTemplate例外発生時に、エラーメッセージ、ソースコード抽出、スタックトレース、リクエスト/レスポンス情報を表示する。

**業務上の目的・背景**：コントローラーアクションに対応するビューテンプレートが存在しない場合のエラーを診断するために使用される。テンプレート名の typo、ファイルの配置ミス、フォーマット指定の問題などを特定するのに役立つ。検索パス情報も含まれるため、どのディレクトリが検索されたかを確認できる。

**画面へのアクセス方法**：開発環境において、存在しないテンプレートをレンダリングしようとした場合に自動的に表示される。

**主要な操作・処理内容**：
1. ActionView::MissingTemplate例外をキャッチ
2. ExceptionWrapperでrescue_template = "missing_template"を選択
3. ソースコード抽出を生成
4. スタックトレースを生成
5. missing_template.html.erbテンプレートで描画

**画面遷移**：
- 遷移元：テンプレートが見つからないアクションへのアクセス
- 遷移先：特になし（エラー画面）

**権限による表示制御**：`action_dispatch.show_detailed_exceptions` 設定に依存。開発環境でのみ詳細表示。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 26 | Debug Exceptions | 主機能 | MissingTemplate例外の捕捉・表示処理 |
| 5 | Action View | 補助機能 | テンプレート検索パス情報の表示 |

## 画面種別

エラー画面（テンプレート未検出）

## URL/ルーティング

本画面は特定のURLに紐づかない。テンプレート未検出エラー発生時に自動的に表示される。

| HTTP メソッド | URL パターン | コントローラー#アクション | 備考 |
|--------------|--------------|--------------------------|------|
| * | * | - | MissingTemplate発生時に自動表示 |

## 入出力項目

本画面は表示専用であり、ユーザーからの入力項目は存在しない。

### 出力項目

| 項目名 | 表示形式 | 説明 |
|--------|----------|------|
| タイトル | h1要素 | "Template is missing" |
| エラーメッセージ | h2要素 | 具体的なエラーメッセージ（テンプレート名、検索パス等） |
| ソースコード抽出 | pre要素 | エラー発生箇所のソースコード |
| スタックトレース | div要素 | Application/Framework/Full Trace |
| リクエスト/レスポンス | div要素 | リクエストパラメータ、ヘッダー等 |

## 表示項目

| No | 項目ID | 項目名 | データ型 | 取得元 | 備考 |
|----|--------|--------|----------|--------|------|
| 1 | title | タイトル | String | 固定値 | "Template is missing" |
| 2 | message | エラーメッセージ | String | @exception_wrapper.message | 例外のメッセージ |
| 3 | source_extracts | ソースコード | Array | @source_extracts | スタックトレース各フレームのソースコード |
| 4 | traces | スタックトレース | Hash | @traces | Application/Framework/Full Trace |

## イベント仕様

### 1-トレース切り替え

**トリガー**: Application Trace/Framework Trace/Full Trace のリンクをクリック

**処理内容**:
1. JavaScript toggle関数を実行
2. 選択されたトレースタイプを表示、他を非表示

**遷移先**: 同一画面（表示切り替え）

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

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

本画面はデータベースアクセスを行わない。

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| - | - | - | データベースアクセスなし |

## メッセージ仕様

| メッセージID | メッセージ種別 | 表示条件 | メッセージ内容 |
|-------------|---------------|---------|--------------|
| MSG-001 | エラー | 常時 | "Missing template {template_name} with {details}" |

## 例外処理

本画面はテンプレート未検出エラー発生時に表示される画面である。

| 例外条件 | 動作 |
|---------|------|
| ActionView::MissingTemplate | 本画面を表示 |

## 備考

- 本画面は開発環境でのみ詳細表示される
- 本番環境では `public/500.html` 等の静的ファイルに表示される
- HTTPステータスコードは500 (Internal Server Error)
- エラーメッセージには以下の情報が含まれる：
  - 検索されたテンプレート名
  - 検索されたパス一覧
  - 検索されたフォーマット
  - 検索されたバリアント
  - 検索されたハンドラ
- テンプレートエラーとは異なり、描画前のテンプレート検索段階で発生する

---

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

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

### 推奨読解順序

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

テンプレート未検出例外の構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | exception_wrapper.rb | `actionpack/lib/action_dispatch/middleware/exception_wrapper.rb` | rescue_templatesでのmissing_templateマッピングを理解する |

**読解のコツ**:
- `rescue_templates["ActionView::MissingTemplate"] = "missing_template"` (行32)
- MissingTemplate例外はAction Viewで定義される

#### Step 2: 例外発生箇所を理解する

MissingTemplate例外の発生タイミングを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | template/resolver.rb | `actionview/lib/action_view/template/resolver.rb` | テンプレート検索ロジックを理解する |

**読解のコツ**:
- テンプレートが見つからない場合にMissingTemplate例外が発生
- 検索パス、フォーマット、バリアント、ハンドラ情報が例外メッセージに含まれる

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

HTML描画の仕組みを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | missing_template.html.erb | `actionpack/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb` | テンプレートの構造を理解する |

**主要処理フロー**:
- **1-4行目**: ヘッダー部（コピーボタン、タイトル）
- **6-7行目**: エラーメッセージ表示
- **9行目**: ソースコード抽出表示
- **10行目**: スタックトレース表示
- **11行目**: リクエスト/レスポンス情報

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

```
コントローラーアクション実行
    │
    ├─ render 呼び出し
    │      │
    │      └─ Action View テンプレート検索
    │             │
    │             └─ テンプレートが見つからない
    │                    │
    │                    └─ raise ActionView::MissingTemplate
    │
    └─ DebugExceptions#call
           │
           ├─ rescue Exception => exception
           │      │
           │      └─ ExceptionWrapper.new(backtrace_cleaner, exception)
           │             │
           │             ├─ rescue_template = "missing_template"
           │             └─ source_extracts 生成
           │
           └─ render_exception
                  │
                  └─ template.render(template: "rescues/missing_template")
                         │
                         ├─ _copy_button.html.erb
                         ├─ エラーメッセージ
                         ├─ _source.html.erb
                         ├─ _trace.html.erb
                         └─ _request_and_response.html.erb
```

### データフロー図

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

テンプレートが必要なアクションへのリクエスト
        │
        └──▶ Action View テンプレート検索
                    │
                    └─ 検索失敗
                           │
                           ├─ テンプレート名
                           ├─ 検索パス一覧
                           ├─ フォーマット
                           ├─ バリアント
                           └─ ハンドラ
                                                              ↓
                                            DebugExceptions ミドルウェア
                                                    │
                                                    └─ ExceptionWrapper
                                                              ↓
                                                    HTML エラーページ
                                                    (missing_template.html.erb)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| debug_exceptions.rb | `actionpack/lib/action_dispatch/middleware/debug_exceptions.rb` | ミドルウェア | 例外キャッチと描画制御 |
| exception_wrapper.rb | `actionpack/lib/action_dispatch/middleware/exception_wrapper.rb` | ソース | 例外情報のラッピング |
| missing_template.html.erb | `actionpack/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb` | テンプレート | テンプレート未検出画面 |
| _source.html.erb | `actionpack/lib/action_dispatch/middleware/templates/rescues/_source.html.erb` | パーシャル | ソースコード表示 |
| _trace.html.erb | `actionpack/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb` | パーシャル | スタックトレース表示 |
| _request_and_response.html.erb | `actionpack/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb` | パーシャル | リクエスト/レスポンス情報 |
| _copy_button.html.erb | `actionpack/lib/action_dispatch/middleware/templates/rescues/_copy_button.html.erb` | パーシャル | クリップボードコピーボタン |
