【Rails】ルーティング、コントローラ、ビューまとめ

ポートフォリオ作成に入り、複数形で書くのか単数形で書くのか
そもそもこのファイル名はどこから来てるんだっけ…と
まだRailsのルーティング、コントローラ、ビューの違いを理解できていないところがあるのでまとめてみます。

---

### 1. ルーティング
```ruby
# [例1]
get 'about', to: 'homes#about', as: 'about'

# [例2]
post 'users', to: 'users#create' 
```
![ルーティング.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3905096/7e4a234a-0aae-3291-dae1-40fdbb2be154.png)

**[例1]**
- **HTTPメソッド：**
`GET`（データを取得）
- **対応するURL：**
`/about`
URLの最後の/about部分を生成しているのは、get 'about' の about部分。
`/about`のURLにアクセスしたらhomes#aboutアクションを実行する。
- **`as: 'about'`部分は、名前付きルート**
これによって`about_path`というヘルパーメソッドが生成される。
- **コントローラのアクション：**
`HomesController` の `about` アクションを実行する。
**コントローラは基本的に複数形で書く。**

**[例2]**
- **HTTPメソッド：**
  `POST`（データを送信）
- **対応するURL：**
  `/users`
  URLの最後の`/users`部分を生成しているのは、`post 'users'`の`users`部分。
  `/users`のURLにアクセスしたら`users#create`アクションを実行する。
- **コントローラのアクション：**
  `UsersController` の `create` アクションを実行する。
  **コントローラは基本的に複数形で書く。**
---

#### **HTTPメソッドとは**
Webブラウザ・クライアントがサーバーにリクエストを送る際に、「**どのような処理を要求しているか**」を指定する手段。
| メソッド | 役割・用途                                                                                        | 具体例                                                                 |
|----------|--------------------------------------------------------------------------------------------------|----------------------------------------------------------------------|
| **GET**   | サーバーから**データを取得**するためのリクエスト。                                                | Webページを表示する、画像やファイルを取得するなど。                   |
| **POST**  | サーバーに**データを送信**して新しいリソースを作成するためのリクエスト。                          | フォームの送信、新規ユーザー登録、投稿作成など。                     |
| **PUT**   | サーバー上の既存データを**更新**するためのリクエスト。                                            | ユーザー情報の更新、記事の編集など。                                 |
| **PATCH** | サーバー上のデータの一部を**部分的に更新**するためのリクエスト。                                  | 一部のフィールドだけ更新する場合。                                   |
| **DELETE**| サーバー上のデータを**削除**するためのリクエスト。                                                | 記事やユーザー情報の削除など。                                       |
| **HEAD**  | GETと同様にリソースを取得しますが、**ヘッダー情報のみ**取得し、ボディは取得しないリクエスト。       | リソースが存在するか確認する際など。                                 |
| **OPTIONS**| サーバーが対応しているHTTPメソッドや設定可能なオプションを確認するためのリクエスト。              | APIの事前検証などに利用される。                                      |

---

#### **名前付きルート（as: 'about'部分）とは**
URLにアクセスするためのヘルパーメソッド（about_pathなど）を生成する仕組み。
ビューでリンクに使用したり…
```erb
<!-- 名前付きルートあり -->
<%= link_to '概要へ', about_path %>
<%= link_to '編集画面へ', edit_user_path(user.id) %>

<!-- なし -->
<%= link_to '概要へ', '/about' %>
<%= link_to '編集画面へ', "/users/#{user.id}/edit" %>
```
コントローラでリダイレクト先のパスを簡単に書ける。
```ruby
# 名前付きルートあり
redirect_to about_path
redirect_to edit_user_path(user.id)

# なし
redirect_to '/about'
redirect_to "/users/#{user.id}/edit"
```

#### ヘルパーメソッドはどうやって決まるのか？
**1.「as」を使わない場合**
asを使わないと、**アクション名とリソース名**で決まる。
```Ruby
# ルーティング
resources :users

# 生成されるヘルパーメソッド
users_path        # GET /users
new_user_path     # GET /users/new
edit_user_path    # GET /users/:id/edit
user_path         # GET /users/:id
```
### **`resources :users`で生成されるルーティングとヘルパーメソッド**

| **アクション**  | **HTTPメソッド** | **URL**                | **ヘルパーメソッド**       | **説明**                                   |
|-----------------|------------------|------------------------|---------------------------|-------------------------------------------|
| **index**       | `GET`           | `/users`              | `users_path`              | ユーザー一覧ページを表示する。             |
| **new**         | `GET`           | `/users/new`          | `new_user_path`           | 新しいユーザーの作成フォームを表示する。   |
| **show**        | `GET`           | `/users/:id`          | `user_path(:id)`          | 特定のユーザーの詳細を表示する。           |
| **create**      | `POST`          | `/users`              | `users_path`              | 新しいユーザーを作成する（フォーム送信）。 |
| **edit**        | `GET`           | `/users/:id/edit`     | `edit_user_path(:id)`     | 特定のユーザーの編集フォームを表示する。   |
| **update**      | `PATCH/PUT`     | `/users/:id`          | `user_path(:id)`          | 特定のユーザーの情報を更新する。           |
| **destroy**     | `DELETE`        | `/users/:id`          | `user_path(:id)`          | 特定のユーザーを削除する。                 |

**2.「as」を使った場合**
ヘルパーメソッドの名前を自分で指定できる。
「as:の後に書いたもの＋_path」となる。
```Ruby
# ルーティング
get 'about', to: 'homes#about', as: 'about'
get 'about', to: 'homes#about', as: 'aaa'

# 生成されるヘルパーメソッド
about_path  # 自動生成されるヘルパーメソッド名
aaa_path  # 自動生成されるヘルパーメソッド名
```

---
### 2. コントローラ

#### コントローラの命名規則
- **フォルダ：**
app/controllers（どのコントローラも共通でここに置かれる）
- **ファイル名：**
**`リソース名＋複数形_controller.rb`**

#### [例1] GETリクエスト
- **ファイル名：**
home`s`_controller.rb
（コントローラはリソース名を複数形にした名前 + _controller）
**コントローラは基本的に複数形で書く。**
```ruby
class HomesController < ApplicationController
  def about
  end
end
```

#### [例2] POSTリクエスト
- **ファイル名：**
user`s`_controller.rb
（コントローラはリソース名を複数形にした名前 + _controller）
**コントローラは基本的に複数形で書く。**
```ruby
class UsersController < ApplicationController
  def create
    # ユーザーの作成処理
    @user = User.new(user_params)
    if @user.save
    else
      render :new
    end
  end
end
```

---

#### リソース名とは
**リソース名**は、Railsにおいて「操作対象となるモデルやデータ」を指す。それは何のデータなのか？を表している。
例：　`users`、`posts`、`comments`など。

リソース名は、基本的に**複数形**で使用され、コントローラやルーティングに反映される。

- **モデル：** User（単数形）
- **コントローラ：** User`s`Controller（複数形）
- **ルーティング：** resources :user`s`（複数形）
- **ビュー：** user`s`/index.html.erb（複数形）

---

### 3. ビュー

#### ビューの命名規則
- **フォルダ：**
リソース名＋複数形（view/usersなど）
- **ファイル名：**
**`アクション名.html.erb`**

#### [例1] 
**ビューのファイル名：** homes/about.html.erb

#### [例2] 
**ビューのファイル名：** users/create.html.erb

---
### 4. モデル

#### モデルの命名規則
- **ファイル名**：
ファイル名、データベースのテーブル名、クラス名すべて
**「リソース名の単数形」**
  
例:
- モデル名：`User`（単数形）
- ファイル名：`user.rb`（単数形）
- クラス名：`class User < ApplicationRecord`（単数形）

#### [例2] モデル（`User`モデル）
```ruby
# app/models/user.rb
class User < ApplicationRecord
  # バリデーションや関連付けなど
  validates :name, presence: true
end
```

- **モデルは基本的に単数形で書く。**
  - **ファイル名**: `user.rb`（単数形）
  - **クラス名**: `class User < ApplicationRecord`（単数形）
---