# 画面設計書 6-メーラー詳細画面

## 概要

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

### 本画面の処理概要

本画面は、特定のメーラープレビュークラスに定義されているメールアクション（メソッド）の一覧を表示する開発者向けデバッグ画面である。メーラープレビュー一覧画面から遷移し、選択されたメーラーの詳細情報を表示する。

**業務上の目的・背景**：特定のメーラーに属するメールアクションを一覧表示することで、開発者がどのメールをプレビューできるかを把握できる。メーラープレビュー一覧画面では全メーラーの全アクションが表示されるが、本画面では特定メーラーに絞り込んだ表示を行う。

**画面へのアクセス方法**：開発環境において、メーラープレビュー一覧画面からプレビュー名をクリックするか、直接 `/rails/mailers/preview/{preview_name}` にアクセスする。

**主要な操作・処理内容**：
1. URLパスからプレビュー名を取得
2. ActionMailer::Preview.findで該当プレビュークラスを検索
3. プレビュークラスのemailsメソッドでメールアクション一覧を取得
4. 各メールアクションへのリンクを一覧表示

**画面遷移**：
- 遷移元：メーラープレビュー一覧画面
- 遷移先：メールプレビュー画面（メールアクション名クリック時）

**権限による表示制御**：`ActionMailer::Base.show_previews` の設定に応じてアクセス制御が変わる。falseの場合はローカルリクエストのみ許可。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 9 | Action Mailer | 主機能 | 特定メーラーのアクション一覧取得処理 |
| 2 | Railties | 補助機能 | MailersControllerによるメーラー詳細情報の制御 |
| 5 | Action View | 補助機能 | メーラー詳細のHTML描画処理 |

## 画面種別

詳細画面（メーラー詳細）

## URL/ルーティング

| HTTP メソッド | URL パターン | コントローラー#アクション |
|--------------|--------------|--------------------------|
| GET | /rails/mailers/preview/{preview_name} | rails/mailers#preview |

## 入出力項目

### 入力項目（URLパラメータ）

| 項目名 | パラメータ名 | データ型 | 必須 | 説明 |
|--------|-------------|----------|------|------|
| プレビュー名 | path | String | Yes | メーラープレビュークラスの識別名 |

### 出力項目

| 項目名 | 表示形式 | 説明 |
|--------|----------|------|
| ページタイトル | h1要素 | "Action Mailer Previews for {preview_name}" |
| メールアクション一覧 | ul/li要素（リンク） | メールプレビュー画面へのリンク |

## 表示項目

| No | 項目ID | 項目名 | データ型 | 取得元 | 備考 |
|----|--------|--------|----------|--------|------|
| 1 | page_title | ページタイトル | String | @page_title | "Action Mailer Previews for {preview_name}" |
| 2 | email_action | メールアクション名 | String | @preview.emails | プレビューで定義されたメソッド名 |

## イベント仕様

### 1-メールアクション名クリック

**トリガー**: メールアクション名（リストアイテム）をクリック

**処理内容**:
1. クリックされたメールアクションのプレビュー画面に遷移

**遷移先**: /rails/mailers/preview/{preview_name}/{email_action}（メールプレビュー画面）

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

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

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

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

## メッセージ仕様

| メッセージID | メッセージ種別 | 表示条件 | メッセージ内容 |
|-------------|---------------|---------|--------------|
| MSG-001 | 情報 | メールアクションが定義されていない場合 | "You have not defined any actions for {preview_name}." |
| MSG-002 | リンク | メールアクションが定義されていない場合 | Action Mailer Basicsガイドへのリンク |

## 例外処理

| 例外条件 | 動作 |
|---------|------|
| 指定されたプレビューが存在しない | AbstractController::ActionNotFound例外を発生 |
| リモートからのアクセス（show_previews=false時） | 403 Forbiddenエラーを返却 |

## 備考

- 本画面は主に開発環境で使用される
- previewアクション内でパスがプレビュー名と一致するかどうかで、本画面とメールプレビュー画面を切り分けている
- Content-Security-Policyはこの画面群で無効化されている

---

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

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

### 推奨読解順序

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

プレビュークラスのメールアクション取得を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | preview.rb | `actionmailer/lib/action_mailer/preview.rb` | emailsメソッドの実装を理解する |

**読解のコツ**:
- `emails` メソッド: プレビュークラスで定義されたpublicインスタンスメソッドを返却
- 継承元のメソッドは除外される

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

コントローラーアクションの処理フローを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | mailers_controller.rb | `railties/lib/rails/mailers_controller.rb` | previewアクション内でのメーラー詳細判定を理解する |

**主要処理フロー**:
1. **32-35行目**: `preview` アクションの分岐ロジック
2. **33行目**: `params[:path] == @preview.preview_name` - パスがプレビュー名と一致するかチェック
3. **34行目**: メーラー詳細画面用のタイトル設定
4. **35行目**: `render action: "mailer"` - mailer.html.erbをレンダリング

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

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | mailer.html.erb | `railties/lib/rails/templates/rails/mailers/mailer.html.erb` | テンプレートの構造を理解する |

**主要処理フロー**:
- **1行目**: ページタイトル（@page_title）の表示
- **3-8行目**: メールアクションがある場合のループ処理
- **6行目**: メールアクション名のリンク生成
- **9-12行目**: メールアクションがない場合のガイダンス表示

#### Step 4: プレビュー検索ロジックを理解する

find_previewの詳細を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | mailers_controller.rb | `railties/lib/rails/mailers_controller.rb` | find_previewプライベートメソッドを理解する |

**主要処理フロー**:
- **69-79行目**: `find_preview` メソッド
- **70-71行目**: パスからプレビュー候補を生成
- **72行目**: ActionMailer::Preview.exists?で存在確認
- **74-75行目**: ActionMailer::Preview.findでプレビュー取得
- **77行目**: 見つからない場合はActionNotFound例外を発生

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

```
ブラウザリクエスト (GET /rails/mailers/preview/{preview_name})
    │
    ├─ before_action :find_preview
    │      │
    │      └─ ActionMailer::Preview.find(preview_name)
    │             │
    │             └─ @preview に格納
    │
    ├─ before_action :require_local! (unless show_previews?)
    │
    └─ Rails::MailersController#preview
           │
           ├─ params[:path] == @preview.preview_name ?
           │      │
           │      └─ Yes: メーラー詳細画面を表示
           │
           ├─ @page_title = "Action Mailer Previews for {preview_name}"
           │
           └─ render action: "mailer"
                  │
                  └─ mailer.html.erb テンプレート描画
                         │
                         └─ @preview.emails ループ
                                │
                                └─ メールアクションリンク生成
```

### データフロー図

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

HTTPリクエスト ──▶ MailersController#preview
(GET /rails/mailers/preview/{name})
        │
        │ find_preview による
        │ プレビュークラス検索
        │
        └──▶ @preview.emails
                    │
                    └─ 定義済みメールアクション一覧取得
                                                              ↓
                                                    HTML ページ
                                                    (mailer.html.erb)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| mailers_controller.rb | `railties/lib/rails/mailers_controller.rb` | コントローラー | メーラープレビュー画面群のアクション定義 |
| mailer.html.erb | `railties/lib/rails/templates/rails/mailers/mailer.html.erb` | テンプレート | メーラー詳細の描画テンプレート |
| preview.rb | `actionmailer/lib/action_mailer/preview.rb` | ソース | ActionMailer::Previewクラス定義 |
