Rails初心者向け：リクエストからレスポンスまでの流れを理解しよう

## はじめに
Yasuと申します．2週間ごとに学習成果をアウトプットする目的で記事を作成しています．自分のための記事にはなりますが，同じように学習している初学者の方にも参考になれば嬉しいです．

今回は，Webアプリケーションを作るためのフレームワークとして広く使われている「Ruby on Rails」について学習しました．

Railsの基本概念を簡単に説明したあとで，具体例を用いて「ユーザリクエストからレスポンスまでの流れ」をわかりやすく解説します．


## 1. Railsとはなにか？
Railsは，Rubyで構築されたWebアプリケーションフレームワークです．効率的にアプリケーションを開発できるように設計されており，データベース操作や画面構築を簡素化する仕組みが備わっています．

## 2. MVCとはなにか？
RailsはMVC（Model-View-Controller）アーキテクチャを採用しています．  
アプリケーションの役割を3つに分けて整理する設計モデルで，以下のように機能します：

### Model（モデル）
データベースとのやり取りを管理します．本来SQLで行う操作を，RailsではRubyコードで記述できます．

**例: 記事を取得する**
```ruby
@article = Article.find(1)
```

### View（ビュー）
ユーザーに表示する画面を構築します．HTMLやCSS，JavaScriptに加え，RailsではRubyコードを埋め込んで動的にデータを表示できます．

**例: 記事タイトルを表示する**
```html
<h1><%= @article.title %></h1>
```

### Controller（コントローラー）
リクエストを受け取り，適切なモデルやビューをつなぐ役割を果たします．

**例: showアクション**
```ruby
def show
  @article = Article.find(params[:id])
end
```

---

## 3. CRUDとはなにか？
CRUDは，アプリケーションの基本操作を表す用語です：
- **Create**: データを作成する
- **Read**: データを取得・表示する
- **Update**: データを更新する
- **Delete**: データを削除する

**例: 記事リソースの場合**
- 記事を投稿する（Create）
- 記事一覧を表示する（Read）
- 記事を編集する（Update）
- 記事を削除する（Delete）

Railsでは，これらの操作を簡単に実現するためのメソッドやURL設計が用意されています．

## 4. RESTとはなにか？
REST（Representational State Transfer）は，Webアプリケーションでリソースを操作する際の設計原則です．Railsでは，このRESTの考え方を基に，リソース操作を簡潔で統一された形で実現しています．

### RESTの特徴
1. **統一されたURL設計**  
   リソース（データの単位）を名詞で表現し，操作（動詞）はHTTPメソッドで指定します．  
   **例: 記事の詳細ページを取得**  
   - URL: `/articles/:id`
   - HTTPメソッド: `GET`

2. **HTTPメソッドによる操作の表現**
   - `GET`: データを取得する
   - `POST`: 新しいデータを作成する
   - `PATCH`: データを更新する
   - `DELETE`: データを削除する

Railsでは，ルートファイルに `resources :articles` と記述するだけで，RESTに基づいた（RESTfulな）URL設計とコントローラーのアクションを自動的に設定できます．

### 記事リソースのRESTfulなURL例
- **記事一覧**: `GET /articles`  
- **記事詳細**: `GET /articles/:id`  
- **新規作成フォーム**: `GET /articles/new`  
- **記事の作成**: `POST /articles`  
- **編集フォーム**: `GET /articles/:id/edit`  
- **記事の更新**: `PATCH /articles/:id`  
- **記事の削除**: `DELETE /articles/:id`

## **5. ユーザーリクエストからレスポンスまでの流れ**

### 場面
ユーザーが「記事一覧ページ」から「記事1の詳細」リンクをクリックし，「記事1の詳細ページ」が画面に表示されるまでの流れを説明します．

### 登場人物
- **ルーター**: `routes.rb`（リクエストを適切な処理に振り分ける）
- **コントローラー**: `articles_controller.rb`（処理を実行する）
- **ビュー**: `show.html.erb`（HTMLを生成する）

### 5.1. ユーザーがリクエストを送信
#### 操作
「記事一覧ページ」から「記事1の詳細」リンクをクリックします．

#### リクエスト内容
- **URL**: `/articles/1`（記事ID 1 の詳細ページを要求）
- **HTTPメソッド**: `GET`


### 5.2. ルーターがリクエストを解析
Railsのルーターは，`routes.rb` に定義されたルールに従ってリクエストを解析します．

#### 設定例
```ruby
resources :articles
```

この記述により，RESTの原則に基づいてリソース「articles」に対応するルートが自動生成されます．  
今回の例では，以下のルートが選択されます：

`GET /articles/1 → ArticlesController#show`

### 5.3. コントローラーが処理を実行
ルーターから指定された`ArticlesController`の`show`アクションが実行されます．

#### コード例
```ruby
class ArticlesController < ApplicationController
  def show
    @article = Article.find(params[:id]) # 記事ID 1 を取得
  end
end
```

#### 処理の流れ
- パラメーター`params[:id]`に含まれる値（この場合は`1`）を使用して，モデルから該当する記事を取得します．
- 取得したデータは，インスタンス変数`@article`に格納されます．



### 5.4. モデルがデータを取得
モデル`Article`がデータベースから記事ID 1 のデータを取得します．

#### 取得データの例
- **title**: `"Railsの基本を学ぼう"`
- **content**: `"この記事ではRailsの基本について解説します．"`

このデータが`@article`に渡されます．

### 5.5. ビューがHTMLを生成
コントローラーから渡された`@article`のデータを使用して，ビュー`show.html.erb`がHTMLを生成します．

#### ビューのコード
```erb
<h1><%= @article.title %></h1>
<p><%= @article.content %></p>
```

#### 生成されるHTML
```html
<h1>Railsの基本を学ぼう</h1>
<p>この記事ではRailsの基本について解説します．</p>
```

### 5.6. ユーザーにレスポンスを返す
生成されたHTMLがクライアント（ユーザーのブラウザ）に送信され，画面に表示されます．

### まとめ
1. ユーザーがリンクをクリック → リクエストが送信される
2. ルーターがリクエストを解析 → 適切なコントローラーのアクションを呼び出す
3. コントローラーがモデルにデータ取得を依頼
4. モデルがデータベースからデータを取得し，コントローラに渡す
5. ビューがデータを元にHTMLを生成
6. 生成されたHTMLがユーザーにレスポンスとして返され，画面に表示される

この一連の流れにより，Railsはリクエストからレスポンスまでを効率的に処理します．