# 機能設計書 5-Action View

## 概要

本ドキュメントは、Ruby on RailsフレームワークにおけるAction Viewの機能設計を記述する。Action Viewは、レンダリングフレームワークとしてMVCアーキテクチャのV（View）を担当し、Webページ構築のための規約とヘルパーを提供する。

### 本機能の処理概要

Action Viewは、テンプレートエンジンを使用してHTMLやその他のフォーマットのレスポンスを生成するレンダリングフレームワークである。

**業務上の目的・背景**：Webアプリケーションでは、動的なHTMLページを生成する必要があるが、HTMLコードをコントローラに直接記述すると保守性が低下する。Action Viewは、テンプレートベースのビュー生成を提供することで、プレゼンテーション層をコントローラから分離し、デザイナーとプログラマの協業を容易にする。また、フォームビルダーやURLヘルパー等の豊富なヘルパーメソッドにより、共通的なHTML生成を効率化する。

**機能の利用シーン**：
- ERB/Haml/Slim等のテンプレートからのHTML生成
- パーシャルによるビューの再利用
- レイアウトによる共通構造の定義
- フォームビルダーによるフォーム生成
- ヘルパーメソッドによるURL・リンク・画像等の生成
- フラグメントキャッシュによるビューのキャッシュ

**主要な処理内容**：
1. テンプレート（ERB等）のコンパイルとレンダリング
2. パーシャルレンダリング
3. レイアウトの適用
4. ヘルパーメソッドの提供（form_with、link_to等）
5. ビューコンテキストの管理
6. テンプレートの検索と解決
7. ストリーミングレンダリング
8. フラグメントキャッシュ

**関連システム・外部連携**：
- Erubi gem: ERBテンプレート処理
- Action Controller: ビューのレンダリングを要求
- Active Model: フォームビルダーとの連携
- Turbo/Stimulus: フロントエンドフレームワークとの連携

**権限による制御**：Action Viewは直接的な認可制御を提供しない。表示内容の制御はコントローラまたはビューヘルパーで行う。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 1 | Railsウェルカム画面 | 補助機能 | ERBテンプレートによるHTML描画処理 |
| 2 | アプリケーションプロパティ画面 | 補助機能 | ERBテンプレートによるプロパティ情報のHTML描画 |
| 3 | ルーティング一覧画面 | 補助機能 | HtmlTableFormatterによるルート情報のテーブル描画 |
| 4 | ソースコードノート一覧画面 | 補助機能 | 注釈一覧のHTML描画処理 |
| 5 | メーラープレビュー一覧画面 | 補助機能 | プレビュー一覧のHTML描画処理 |
| 6 | メーラー詳細画面 | 補助機能 | メーラー詳細のHTML描画処理 |
| 7 | メールプレビュー画面 | 補助機能 | HTML/テキスト形式の切り替え表示 |
| 8 | 例外診断画面 | 補助機能 | スタックトレース・ソースコードのHTML描画 |
| 10 | テンプレート未検出画面 | 補助機能 | テンプレート検索パス情報の表示 |
| 13 | テンプレートエラー画面 | 補助機能 | エラー発生行のソースコード抽出・表示 |
| 15 | テンプレート不正確画面 | 補助機能 | コントローラとビューの命名規則説明 |
| 21-23 | ログイン・パスワード関連画面 | 補助機能 | フォームのHTML描画処理 |

## 機能種別

レンダリングフレームワーク / テンプレートエンジン / ビューヘルパー

## 入力仕様

### 入力パラメータ

#### render メソッド

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| template | String | No | テンプレート名 | 存在するテンプレート |
| partial | String | No | パーシャル名 | 存在するパーシャル |
| collection | Array | No | コレクション | Enumerable |
| locals | Hash | No | ローカル変数 | - |
| layout | String/Boolean | No | レイアウト | - |

#### form_with ヘルパー

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| model | Object | No | モデルオブジェクト | ActiveModel互換 |
| url | String/Hash | No | フォーム送信先URL | - |
| method | Symbol | No | HTTPメソッド | :get/:post/:patch/:put/:delete |
| local | Boolean | No | 非同期送信の無効化 | - |

### 入力データソース

- テンプレートファイル（app/views/）
- コントローラからのインスタンス変数
- ヘルパーモジュール
- I18n翻訳ファイル

## 出力仕様

### 出力データ

#### render

| 項目名 | 型 | 説明 |
|--------|-----|------|
| output | String | レンダリングされたHTML/テキスト |

#### form_with

| 項目名 | 型 | 説明 |
|--------|-----|------|
| html | SafeBuffer | フォームHTML |

### 出力先

- HTTPレスポンスボディ
- 文字列バッファ

## 処理フロー

### 処理シーケンス（テンプレートレンダリング）

```
1. render 呼び出し
   └─ レンダリング開始
2. テンプレート検索
   └─ LookupContext でテンプレートを解決
3. テンプレートコンパイル
   └─ ERB等をRubyコードに変換
4. ビューコンテキスト作成
   └─ インスタンス変数・ヘルパーの設定
5. テンプレート実行
   └─ コンパイル済みコードの実行
6. レイアウト適用
   └─ コンテンツをレイアウトに埋め込み
7. 結果返却
   └─ 生成されたHTMLを返却
```

### フローチャート

```mermaid
flowchart TD
    A[render 呼び出し] --> B[LookupContext]
    B --> C{テンプレート発見?}
    C -->|Yes| D[テンプレートコンパイル]
    C -->|No| E[MissingTemplate例外]
    D --> F[ビューコンテキスト作成]
    F --> G[テンプレート実行]
    G --> H{パーシャル?}
    H -->|Yes| I[パーシャルレンダリング]
    H -->|No| J{レイアウト適用?}
    I --> J
    J -->|Yes| K[レイアウト適用]
    J -->|No| L[結果返却]
    K --> L
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | テンプレート規約 | app/views/controller_name/action_name.format.handler の形式でテンプレートを検索 | render時 |
| BR-002 | パーシャル命名 | パーシャルファイルは _ で始まる | render partial: 時 |
| BR-003 | レイアウト適用 | デフォルトでapp/views/layouts/application を使用 | レイアウト指定なし時 |
| BR-004 | HTML エスケープ | 出力は自動的にHTMLエスケープされる | ERB出力時 |
| BR-005 | コレクションレンダリング | collectionオプションで同一パーシャルを繰り返し描画 | render collection: 時 |

### 計算ロジック

**テンプレートパス解決**：
```ruby
# コントローラ: UsersController, アクション: show, フォーマット: html
# -> app/views/users/show.html.erb
```

## データベース操作仕様

Action View自体は直接データベース操作を行わない。

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| - | - | - | Action View自体はDB操作を行わない |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ActionView::MissingTemplate | テンプレートが見つからない | テンプレートファイルを作成 |
| - | ActionView::TemplateError | テンプレート内でエラー発生 | テンプレートコードを修正 |
| - | ActionView::SyntaxErrorInTemplate | テンプレートの構文エラー | ERB構文を確認 |
| - | ActionView::StrictLocalsError | strict_localsで未定義の変数参照 | ローカル変数を渡す |

### リトライ仕様

テンプレートレンダリングエラー時のリトライは行われない。

## トランザクション仕様

Action Viewはトランザクション管理を直接行わない。

## パフォーマンス要件

- テンプレートコンパイル結果はキャッシュされる
- フラグメントキャッシュで部分的なビューをキャッシュ可能
- コレクションレンダリングの最適化（マルチフェッチキャッシュ）

## セキュリティ考慮事項

- 出力はデフォルトでHTMLエスケープ（XSS対策）
- raw/html_safeの使用は慎重に
- CSRFトークンはform_withで自動挿入
- Content Security Policyヘルパーの提供

## 備考

Action Viewは `actionview` gem として提供される。ERBテンプレート処理を含む。

---

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

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

### 推奨読解順序

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

Action Viewのモジュール構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | action_view.rb | `actionview/lib/action_view.rb` | モジュール定義とautoload一覧 |

**読解のコツ**: `autoload_under` でグループ化されたモジュール群を把握する。

**主要処理フロー**:
- **32-89行目**: ActionViewモジュールの定義とautoload
- **37-63行目**: eager_autoloadブロック
- **55-63行目**: autoload_under "renderer" でレンダラー群の定義
- **80-88行目**: エラークラスの定義

#### Step 2: Baseクラスを理解する

ビューコンテキストの基本を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | base.rb | `actionview/lib/action_view/base.rb` | ActionView::Baseの基本構造 |

#### Step 3: Helpersを理解する

ヘルパーモジュール群を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | helpers.rb | `actionview/lib/action_view/helpers.rb` | Helpersモジュールの構成 |

#### Step 4: Templateを理解する

テンプレートの処理を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | template.rb | `actionview/lib/action_view/template.rb` | Templateクラスの実装 |

#### Step 5: Rendererを理解する

レンダリング処理を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 5-1 | renderer.rb | `actionview/lib/action_view/renderer/renderer.rb` | Rendererクラス |
| 5-2 | template_renderer.rb | `actionview/lib/action_view/renderer/template_renderer.rb` | テンプレートレンダラー |
| 5-3 | partial_renderer.rb | `actionview/lib/action_view/renderer/partial_renderer.rb` | パーシャルレンダラー |

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

```
ActionView::Base
    │
    ├─ Helpers (include)
    │      ├─ FormHelper (form_with等)
    │      ├─ UrlHelper (link_to等)
    │      ├─ TagHelper (tag, content_tag等)
    │      ├─ AssetTagHelper (image_tag等)
    │      └─ その他多数のヘルパー
    │
    ├─ Rendering (include)
    │      └─ render メソッド
    │
    └─ Renderer
           ├─ TemplateRenderer
           │      └─ テンプレートレンダリング
           ├─ PartialRenderer
           │      └─ パーシャルレンダリング
           └─ CollectionRenderer
                  └─ コレクションレンダリング
```

### データフロー図

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

render呼び出し ───▶ LookupContext ───▶ テンプレート検索
       │                   │
       ▼                   ▼
テンプレートファイル ───▶ Template ───▶ コンパイル
       │                    │
       ▼                    ▼
インスタンス変数 ───▶ ViewContext ───▶ 実行
       │                    │
       ▼                    ▼
ヘルパー呼び出し ───▶ Helpers ───▶ HTML生成
       │
       ▼
レイアウト ───▶ yield ───▶ 最終HTML
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| action_view.rb | `actionview/lib/action_view.rb` | ソース | メインエントリーポイント |
| base.rb | `actionview/lib/action_view/base.rb` | ソース | ビューコンテキスト基底クラス |
| helpers.rb | `actionview/lib/action_view/helpers.rb` | ソース | ヘルパーモジュール群 |
| template.rb | `actionview/lib/action_view/template.rb` | ソース | テンプレートクラス |
| renderer.rb | `actionview/lib/action_view/renderer/renderer.rb` | ソース | レンダラー基底 |
| template_renderer.rb | `actionview/lib/action_view/renderer/template_renderer.rb` | ソース | テンプレートレンダラー |
| partial_renderer.rb | `actionview/lib/action_view/renderer/partial_renderer.rb` | ソース | パーシャルレンダラー |
| lookup_context.rb | `actionview/lib/action_view/lookup_context.rb` | ソース | テンプレート検索 |
| layouts.rb | `actionview/lib/action_view/layouts.rb` | ソース | レイアウト管理 |
| buffers.rb | `actionview/lib/action_view/buffers.rb` | ソース | 出力バッファ |
