# 画面設計書 15-テンプレート不正確画面

## 概要

本ドキュメントは、Ruby on Railsフレームワークにおける「テンプレート不正確画面」の設計仕様を定義する。インタラクティブなリクエスト（ブラウザからのHTML要求）に対してビューテンプレートが存在しない場合に表示される開発者向けエラー診断画面である。

### 本画面の処理概要

この画面は、Railsアプリケーションの開発中に、ブラウザからのリクエストに対応するビューテンプレートが存在しない場合に表示されるエラー診断画面である。Railsの「設定より規約（Convention over Configuration）」の原則に基づき、コントローラーアクションとビューテンプレートの命名規則を説明し、開発者が適切なテンプレートを作成できるよう支援する。

**業務上の目的・背景**：Railsではコントローラーのアクションとビューテンプレートが命名規則で関連付けられる。例えば`UsersController#show`アクションは`app/views/users/show.html.erb`テンプレートを使用する。この画面は、この規則を理解していない開発者や、テンプレート作成を忘れた開発者に対して、適切なファイルパスと命名規則を案内することで、開発効率を向上させる。また、APIエンドポイントで204 No Contentを返す設計の場合には、このエラーは無視してよいことも説明している。

**画面へのアクセス方法**：開発環境において、コントローラーアクションが正常に完了したがHTMLレスポンスを期待するブラウザリクエストに対して対応するビューテンプレートが存在しない場合に、`ActionController::MissingExactTemplate`例外が発生し、この画面が表示される。

**主要な操作・処理内容**：
1. エラーメッセージの表示 - テンプレートが見つからないことを明示
2. コントローラーとアクションの表示 - 対象のコントローラーとアクション名を明示
3. 期待されるファイルパスの表示 - 作成すべきテンプレートファイルのパスを提示
4. 命名規則の説明 - Railsのテンプレート命名規則を解説
5. API例外の説明 - 204 No Contentを返すAPIエンドポイントの場合は無視可能なことを説明
6. ドキュメントへのリンク - Rails Guidesの該当セクションへのリンクを提供

**画面遷移**：
- 遷移元：ビューテンプレートが存在しないアクションへのHTMLリクエスト
- 遷移先：Rails Guides「Layouts and Rendering in Rails」ページ（外部リンク）

**権限による表示制御**：
- 開発環境（`config.consider_all_requests_local = true`）でのみ詳細情報が表示される
- 本番環境では、HTTPステータスコード406（Not Acceptable）が返される

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 26 | Debug Exceptions | 主機能 | インタラクティブリクエストに対するテンプレート不足エラー表示 |
| 5 | Action View | 補助機能 | コントローラとビューの命名規則説明 |

## 画面種別

エラー診断（開発環境専用）

## URL/ルーティング

特定のURLは存在しない。ビューテンプレートが存在しないアクションへのリクエスト時に、DebugExceptionsミドルウェアが例外を捕捉して本画面を表示する。

例：
- `GET /users/1` - UsersController#showにshow.html.erbが存在しない場合

## 入出力項目

本画面はエラー診断画面のため、ユーザー入力項目は存在しない。

| 項目 | 入出力 | 説明 |
|------|--------|------|
| なし | - | ユーザー入力を受け付けない |

## 表示項目

| 項目名 | データ型 | 説明 | ソース |
|--------|----------|------|--------|
| ヘッダータイトル | String | "No view template for interactive request" 固定文字列 | テンプレート固定値 |
| エラーメッセージ | String | 例外のメッセージ | `@exception.message` |
| コントローラー名 | String | 対象のコントローラー名 | `@exception.controller` |
| アクション名 | String | 対象のアクション名 | `@exception.action_name` |
| コントローラーパス | String | コントローラーファイルの期待されるパス | `@exception.controller.controller_path` |
| テンプレートパス | String | 期待されるテンプレートファイルのパス | 動的に生成 |
| 命名規則説明 | String | Railsのテンプレート命名規則の解説 | テンプレート固定文字列 |
| API例外説明 | String | 204 No Contentの場合は無視可能の説明 | テンプレート固定文字列 |
| ドキュメントリンク | URL | Rails Guidesへのリンク | 固定URL |
| コピーボタン | HTML | エラー情報をクリップボードにコピー | `_copy_button` パーシャル |

## イベント仕様

### 1-ドキュメントリンク押下

**処理内容**：Rails Guidesの「Layouts and Rendering in Rails」セクションを新しいタブで開く。

**トリガー**：ドキュメントリンクのクリック

**処理フロー**：
1. ユーザーがリンクをクリック
2. ブラウザが外部URL（https://guides.rubyonrails.org/layouts_and_rendering.html#rendering-by-default-convention-over-configuration-in-action）を開く

**画面遷移**：外部サイトへ遷移（新規タブ）

### 2-コピーボタン押下

**処理内容**：画面に表示されているエラー情報をクリップボードにコピーする。

**トリガー**：コピーボタンクリック

**処理フロー**：
1. JavaScriptがエラーメッセージをテキストとして取得
2. クリップボードにコピー
3. ユーザーに視覚的フィードバックを表示

**画面遷移**：なし（同一画面に留まる）

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| なし | なし | なし | 本画面はデータベースへの操作を行わない |

## メッセージ仕様

| メッセージID | メッセージ種別 | メッセージ内容 | 表示条件 |
|-------------|---------------|---------------|----------|
| MSG-001 | エラー | "No view template for interactive request" | 常時ヘッダーに表示 |
| MSG-002 | エラー | 例外メッセージ | 常時h2に表示 |
| MSG-003 | 情報 | "NOTE: Rails usually expects a controller action to render a view template with the same name." | 常時summaryに表示 |
| MSG-004 | 情報 | "For example, a {Controller}#{action} action..." | 常時p要素に表示 |
| MSG-005 | 情報 | "However, if this controller is an API endpoint responding with 204 (No Content)..." | 常時p要素に表示 |

## 例外処理

| 例外種別 | 発生条件 | 処理内容 |
|---------|---------|---------|
| ActionController::MissingExactTemplate | インタラクティブリクエストに対応するビューテンプレートが存在しない | 本画面を表示（開発環境）/406レスポンス（本番環境） |

## 備考

- `ActionController::MissingExactTemplate`はRails 7.0で導入された例外
- HTTPステータスコード406（Not Acceptable）で応答する
- APIコントローラーで`head :no_content`を返す場合は、このエラーは発生しない
- APIモードのRailsアプリケーションでは、この例外は発生しにくい

---

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

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

### 推奨読解順序

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

まず、ActionController::MissingExactTemplateとExceptionWrapperの関係を理解することが重要。

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

**読解のコツ**: 37行目で`ActionController::MissingExactTemplate`が`missing_exact_template`テンプレートにマッピングされていることを確認。20行目で`:not_acceptable`（406）ステータスコードにマッピングされていることも確認。

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

処理の起点となるDebugExceptionsミドルウェアを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | debug_exceptions.rb | `actionpack/lib/action_dispatch/middleware/debug_exceptions.rb` | ミドルウェアのcallメソッド、例外捕捉の流れ |

**主要処理フロー**:
1. **30-47行目**: `call`メソッドで例外をキャッチ
2. **121-135行目**: `create_template`でDebugViewを作成
3. **80-95行目**: `render_for_browser_request`でテンプレートをレンダリング

#### Step 3: テンプレート構造を理解する

エラー画面のテンプレートと説明内容を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | missing_exact_template.html.erb | `actionpack/lib/action_dispatch/middleware/templates/rescues/missing_exact_template.html.erb` | メインテンプレート構造、命名規則の説明 |

**主要処理フロー**:
- **1-4行目**: ヘッダーでタイトルとコピーボタンを表示
- **6-7行目**: mainセクションでエラーメッセージを表示
- **9-21行目**: summaryセクションで命名規則の説明
- **13-15行目**: 具体的なコントローラーパスとテンプレートパスを動的に生成
- **17-19行目**: API例外（204 No Content）の場合は無視可能なことを説明
- **20-21行目**: Rails Guidesへのリンクを提供

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

```
HTTPリクエスト（HTML要求）
    │
    ├─ DebugExceptions#call（middleware/debug_exceptions.rb:30）
    │      │
    │      ├─ @app.call(env) - 通常のアプリケーション処理
    │      │      │
    │      │      └─ ActionController::MissingExactTemplate 発生
    │      │             ├─ controller: 対象コントローラー
    │      │             └─ action_name: 対象アクション名
    │      │
    │      ├─ ExceptionWrapper.new（exception_wrapper.rb:51）
    │      │      ├─ rescue_template → "missing_exact_template"
    │      │      └─ status_code → 406 (Not Acceptable)
    │      │
    │      └─ render_exception（debug_exceptions.rb:58）
    │             │
    │             └─ render_for_browser_request（debug_exceptions.rb:80）
    │                    │
    │                    ├─ create_template（debug_exceptions.rb:121）
    │                    │      └─ DebugView.new
    │                    │
    │                    └─ template.render
    │                           └─ rescues/missing_exact_template.html.erb
    │                                  │
    │                                  ├─ _copy_button.html.erb
    │                                  ├─ 動的にcontroller_pathを取得
    │                                  ├─ 動的にaction_nameを取得
    │                                  └─ 期待されるテンプレートパスを生成
    │
    └─ HTTPレスポンス（406 Not Acceptable）
```

### データフロー図

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

HTTPリクエスト ───────▶ コントローラーアクション実行
（HTML要求）                   │
                              ▼
                         ビューテンプレート検索
                              │
                              ▼
                         テンプレート未検出
                              │
                              ▼
                    ActionController::MissingExactTemplate
                         - controller: UsersController
                         - action_name: "show"
                         - controller_path: "users"
                              │
                              ▼
                    DebugExceptions
                              │
                              ▼
                    ExceptionWrapper
                         - rescue_template: "missing_exact_template"
                         - status_code: 406
                              │
                              ▼
                    DebugView
                         - @exception
                              │
                              ▼
                    missing_exact_template.html.erb
                         │
                         └─ 期待されるテンプレートパス:
                            app/views/users/show.html.erb
                              │
                              ▼
                    HTMLレスポンス ───────▶ ブラウザ表示
                    (406 Not Acceptable)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| debug_exceptions.rb | `actionpack/lib/action_dispatch/middleware/debug_exceptions.rb` | ソース | 例外捕捉・エラー画面生成ミドルウェア |
| exception_wrapper.rb | `actionpack/lib/action_dispatch/middleware/exception_wrapper.rb` | ソース | 例外情報のラッパークラス |
| missing_exact_template.html.erb | `actionpack/lib/action_dispatch/middleware/templates/rescues/missing_exact_template.html.erb` | テンプレート | テンプレート不正確エラー画面のメインテンプレート |
| _copy_button.html.erb | `actionpack/lib/action_dispatch/middleware/templates/rescues/_copy_button.html.erb` | テンプレート | コピーボタンパーシャル |
| layout.html.erb | `actionpack/lib/action_dispatch/middleware/templates/rescues/layout.erb` | テンプレート | エラー画面共通レイアウト |
