ページ遷移について、いまさら知った。getとroot

# はじめに
あるボタンやロゴを押すとトップページに移動したり、新規登録画面に移動したり。そんな設定がされている事よくありますよね。中の構造はどうなっているのか、絶対課題の中で学習しているはずですが、当時ははっきり理解していなく、つい最近になりやっと（半分）理解。忘れないようにアウトプットしたいと思います。

## 例を挙げてみる
app/views/shared/_header.html.erb
```java
<%= link_to "サイト名", '#', class: "text-xl md:text-3xl text-white" %>
```

ヘッダーで入力したコードになります。ヘッダーの左側に白い文字で「サイト名」と表示されていると想像してください。
現在リンク先は`#`となっていて「サイト名」という文字を押しても画面遷移はされないようになっています

### 遷移先をトップページにする
トップページが StaticPagesController の top アクションに関連付けられています
app/controllers/static_pages_controller.rb
```java
class StaticPagesController < ApplicationController
  def top; end
end
```

config/routes.rbに次のような設定をします
```java
Rails.application.routes.draw do
  root 'static_pages#top'
end
```
この設定により、root_path は StaticPagesController の top アクションへのパスを指し示すようになります。

さいごにapp/views/shared/_header.html.erbに最終的なリンク先を設定します
```java
<%= link_to "サイト名", root_path, class: "text-xl md:text-3xl text-white" %>
```



## rootとget
### 1. **`root_path`の特別な役割**

`root_path` は、Rails アプリケーションのルート URL を指すヘルパーメソッドです。`config/routes.rb` で以下のように設定された場合:

```ruby
root 'static_pages#top'
```
この設定により、`root_path` は `StaticPagesController` の `top` アクションへのパスを指し示すようになります。これはアプリケーションの「ホームページ」を表すため、通常は 1 つしか設定できません。


### 2. **`root_path` の設定と他のルートパスとの違い**
- **`root` ルート**:
    - `root` はアプリケーション全体の「ホームページ」を指定するもので、1 つのルートだけが存在します。
    - これは `root 'controller#action'` という形式で指定します。
    - 他のルートとは異なり、`root` で指定された URL はアプリケーション全体で一意です。
例えば、`root 'static_pages#top'` と設定した場合、アプリケーションのルートパス (`/`) にアクセスすると `StaticPagesController` の `top` アクションが呼ばれます。
- **通常の `get` ルート**:
    - `get` メソッドで指定されるルートは、リソースやアクションに基づいて複数設定できます。
例えば、`get 'terms_of_service', to: 'static_pages#terms_of_service'` と設定すれば、`terms_of_service_path` でそのページにアクセスできます。
    - これにより、複数の異なる URL パスが異なるコントローラーアクションに対応します。

### 3. **なぜ `root_path` のような特別なパスヘルパーが存在するのか**

`root_path` はアプリケーションの「ホームページ」を示すための特別なメソッドであり、`get` メソッドで指定する通常のルートとは異なります。`root` ルートは一意であり、アプリケーション全体のトップページに対応します。そのため、以下のように `root_path` という名前でアクセスできるのです。

### 4. **`get` との違い**

- **`get`**:
    - URL パターンとコントローラーアクションをマッピングします。これにより、複数のルートを設定できます。
    - 例: `get 'terms_of_service', to: 'static_pages#terms_of_service'` では、`terms_of_service_path` がそのルートに対応します。
- **`root`**:
    - アプリケーションのホームページを指定するための特別なルートです。1 つしか設定できません。
    - 例: `root 'static_pages#top'` は `root_path` でアクセスできます。

要約すると、`root_path` はアプリケーションの「ルート」URL を指し示す特別なメソッドであり、他の `get` ルートと異なり、一つだけ設定できるという特徴があります。


## ページ遷移に関するコードの構成をもっと深ぼる

ページ遷移に関するコードは、一般的には以下の 3 つのファイルやディレクトリで構成されています

1. **`config/routes.rb`**:
    - アプリケーションの URL ルーティングを定義するファイルです。どの URL がどのコントローラーのどのアクションにマッピングされるかを指定します。
    - 例: `root 'static_pages#top'` や `get 'about', to: 'static_pages#about'` など。
2. **コントローラー (`app/controllers/`)**:
    - ビジネスロジックを担当するクラスです。リクエストを受け取り、ビューをレンダリングするためのデータを用意します。
    - 例: `StaticPagesController` というクラスが `top` や `about` アクションを持つ場合、そのアクションに関連するビジネスロジックが記述されます。
3. **ビュー (`app/views/`)**:
    - ユーザーに表示される HTML を生成するファイルです。コントローラーが渡したデータを使って、最終的な表示内容を決定します。
    - 例: `app/views/static_pages/top.html.erb` や `app/views/static_pages/about.html.erb` などが、各アクションに対応するビューです。

この 3 つの部分が連携して、ユーザーがリクエストしたページが表示されます。

## さいごに
ルート設定に調べるほど、奥が深く難しい。「あれ、そういえばこのコードってどういう仕組みなんだっけ？」この流れから復習or新たな気づきにつながるので「なぜ」は大切。