【Rails】routesが難しい…苦戦したのでまとめてみた

# はじめに
こんにちは、エンジニア2年目の嶋田です。
まずは、この記事を開いていただきありがとうございます！

Railsのルーティング（routes）は、WebアプリケーションのURLとコントローラーアクションのマッピングを定義する重要な要素です。
しかし、私自身かなり理解に苦戦しました…
少し勉強したので、この記事では、Railsのルーティングについて初心者向けに説明してみようと思います。
少し長いですが、ぜひ最後までお付き合いください。

# 概要
この記事は、Railsのルーティングに焦点を当てており、以下の内容が含まれています。

- Railsのルーティングとは何かについての説明。
- ルーティングの基本的な概念、config/routes.rbファイルの基本、デフォルトのルーティング設定、ルーティングの設定方法についての解説。
R- ESTfulルーティングについての説明と基本的な原則。
- 名前付きルートの利点と基本的な設定方法。
- ルートヘルパーの説明と主要なルートヘルパーの紹介。
- エラーページのカスタムルーティングについての説明と設定例。
- ルート情報の確認とトラブルシューティング手順の解説。

# こんな人に読んでほしい
- Railsを学んでいる初心者エンジニア
- Railsのルーティングに関する基本的な知識を身につけたい人
- Rilsで開発をしていてルーティングで躓いた人

# 目次

- [Railsのルーティングとは何か？](#railsのルーティングとは何か)
- [ルーティングの基本](#ルーティングの基本)
  - [config/routes.rbファイルの基本](#configroutesrbファイルの基本)
  - [デフォルトのルーティング設定](#デフォルトのルーティング設定)
  - [ルーティングの設定方法](#ルーティングの設定方法)
- [RESTfulルーティング](#restfulルーティング)
  - [RESTfulなルーティングとは何か](#restfulなルーティングとは何か)
  - [RESTfulルーティングの基本](#restfulルーティングの基本)
- [名前付きルート](#名前付きルート)
  - [名前付きルートの利点](#名前付きルートの利点)
  - [名前付きルートの基本](#名前付きルートの基本)
- [ルートヘルパー](#ルートヘルパー)
  - [ルートヘルパーとは何か](#ルートヘルパーとは何か)
  - [主要なルートヘルパーの紹介](#主要なルートヘルパーの紹介)
- [エラーページのカスタムルーティング](#エラーページのカスタムルーティング)
  - [エラーページのカスタムルーティングとは何か](#エラーページのカスタムルーティングとは何か)
  - [カスタムルーティングの設定例](#カスタムルーティングの設定例)
- [ルート情報の確認とトラブルシューティング](#ルート情報の確認とトラブルシューティング)
    - [ルート情報の確認](#ルート情報の確認)
    - [トラブルシューティング手順](#トラブルシューティング手順)
- [まとめ](#まとめ)
- [参考文献](#参考文献)

# Railsのルーティングとは何か？

Railsのルーティングは、Webアプリケーションにおける「URLとコントローラーアクションの対応関係」を定義する重要な要素です。つまり、ユーザーがアプリケーション内のどのページにアクセスするかを決定する仕組みです。

# ルーティングの基本
ルーティングを理解するためには、以下の基本的な概念を押さえておきましょう。

## config/routes.rbファイルの基本

`config/routes.rb`ファイルは、Railsアプリケーション内のルーティングを設定する場所です。このファイルには、URLパスとそれに対応するコントローラーアクションを記述します。例えば、`/articles`というURLに対応するコントローラーアクションを指定します。

```ruby
Rails.application.routes.draw do
  get '/articles', to: 'articles#index'
end
```

この設定は、「/articlesにアクセスされたらArticlesControllerのindexアクションを実行する」という意味です。

## デフォルトのルーティング設定

Railsはデフォルトで7つの基本的なルート設定を提供します。これにより、アプリケーション内のリソースへのアクセスが簡単になります。これらの設定を使用すると、例えばGET /articlesで記事一覧を表示し、GET /articles/1で特定の記事を表示できます。これは、CRUD操作（Create、Read、Update、Delete）に対応しています。

## ルーティングの設定方法

カスタムルートを設定するには、config/routes.rbファイル内で特定のルート設定を追加します。たとえば、新しいカスタムルートを追加する場合は、以下のように記述します。

```ruby
Rails.application.routes.draw do
  # カスタムルートの設定例
  get '/custom_route', to: 'controller#action'
end
 ```
 この設定では、/custom_routeにアクセスされた場合、指定したコントローラーとアクションが呼び出されます。カスタムルートを使用することで、アプリケーションのURL構造を柔軟にカスタマイズできます。

# RESTfulルーティング
RESTfulルーティングは、RailsにおいてWebアプリケーションのURL設計を効果的に行うためのアプローチです。REST（Representational State Transfer）は、Webアプリケーションの設計原則の一つであり、リソースを表現し、HTTPメソッドを使用して操作する方法を指します。

## RESTfulなルーティングとは何か

RESTfulなルーティングは、アプリケーション内のリソース（たとえば、記事やユーザーなど）を、標準的なHTTPメソッド（GET、POST、PUT、DELETEなど）を使用して操作するためのURLパターンを設計する方法です。これにより、アプリケーションのリソースが一貫性のある方法でアクセスされ、操作されるようになります。

例えば、RESTfulなURL設計では、記事の一覧を表示するURLは`/articles`であり、特定の記事を表示するURLは`/articles/1`のようになります。HTTPメソッドを使用して、それぞれのURLに対して適切な操作（一覧表示、詳細表示、更新、削除など）を実行できます。

以下は、RESTfulなルーティングの一部を示す`config/routes.rb`ファイルのコード例です。

```ruby
Rails.application.routes.draw do
  # 記事リソースに対するRESTfulなルーティング
  resources :articles
end
```
このコードは、記事リソースに対してCRUD操作を実行するためのRESTfulなルーティングを自動的に生成します。例えば、GET /articlesで記事の一覧を表示し、GET /articles/1で特定の記事を表示します。


## RESTfulルーティングの基本

RESTfulなルーティングの基本的な原則は以下の通りです。

1. **HTTPメソッドの活用**: HTTPメソッドを使ってリソースを操作します。例えば、`GET`はリソースの取得に、`POST`は新しいリソースの作成に、`PUT`はリソースの更新に、`DELETE`はリソースの削除に使用します。

2. **一貫性のあるURLパターン**: リソースごとに一貫性のあるURLパターンを設計します。例えば、記事リソースに関連するURLは`/articles`（一覧表示）、`/articles/1`（詳細表示）、`/articles/new`（新規作成フォーム）、`/articles/1/edit`（編集フォーム）などとなります。

3. **ルーティングの自動生成**: Railsでは、RESTfulなリソースに対するルート設定を自動生成するためのヘルパーメソッドが提供されています。これにより、簡単にRESTfulなURLを設定できます。

RESTfulルーティングは、Railsアプリケーションの設計をシンプルかつ効率的にするための重要な概念です。初心者でもこのアプローチを理解し、適切に活用することで、アプリケーションの開発がスムーズに行えるようになります。

# 名前付きルート
名前付きルートは、Railsアプリケーションにおいてルート設定に名前を付ける仕組みです。名前付きルートは、URLを直接指定するのではなく、わかりやすい名前を使用してリンクやリダイレクトを行う際に役立ちます。

## 名前付きルートの利点

名前付きルートを使用すると、以下のような利点があります。

- **わかりやすいコード**: 名前付きルートを使うことで、コードがわかりやすくなります。URLを直接埋め込むのではなく、名前を使ってリンクを生成するため、コードが読みやすく保守性が向上します。

- **ルート設定の変更に強い**: ルート設定を変更した場合でも、名前付きルートを使用している箇所は自動的に更新されます。URLを直接埋め込む場合、変更が必要な箇所を手動で修正する必要があります。

名前付きルートを利用すると、コードの可読性が向上し、アプリケーションの保守性が高まります。これらの利点を活かして、効率的なRailsアプリケーションを開発しましょう。

## 名前付きルートの基本

名前付きルートを設定するには、`config/routes.rb`ファイル内で`as:`オプションを使用します。以下は名前付きルートを設定する例です。

```ruby
Rails.application.routes.draw do
  # 記事リソースに名前付きルートを設定
  resources :articles, as: :custom_articles
end
```
この設定では、articlesリソースに対して名前付きルートをcustom_articlesとして設定しています。これにより、例えばcustom_articles_pathやcustom_article_url(1)のように名前付きルートを使用できます。

名前付きルートを利用すると、コードがわかりやすくなり、アプリケーションの保守性が向上するため、積極的に活用しましょう。

# ルートヘルパー
ルートヘルパーは、Railsアプリケーションにおいてルート（URL）を生成するための便利なメソッドです。これを使うことで、URLを直接記述することなく、名前付きルートを呼び出し、リンクを生成したり、リダイレクトを行ったりすることができます。

## ルートヘルパーとは何か

ルートヘルパーは、名前付きルートを使用して、コントローラーアクションやリソースへのURLを生成するためのメソッドです。これにより、コードがわかりやすくなり、保守性が向上します。

## 主要なルートヘルパーの紹介

以下に、主要なルートヘルパーとその使用例を示します。

| ルートヘルパー            | 使用例                       | 説明                                       |
|--------------------------|------------------------------|--------------------------------------------|
| `root_path`               | `root_path`                   | ルートURLを生成します。                   |
| `article_path`            | `article_path(@article)`      | 特定の記事の詳細ページへのURLを生成します。  |
| `articles_path`           | `articles_path`               | 記事一覧ページへのURLを生成します。        |
| `new_article_path`        | `new_article_path`            | 新規記事作成ページへのURLを生成します。      |
| `edit_article_path`       | `edit_article_path(@article)` | 記事編集ページへのURLを生成します。        |

これらのルートヘルパーを使用することで、URLを記述する手間を省き、安全にURLを生成できます。例えば、`article_path(@article)`は特定の記事の詳細ページへのリンクを生成します。ルートヘルパーはRailsアプリケーション内で頻繁に使用され、効果的なリンク生成をサポートします。

# エラーページのカスタムルーティング
エラーページのカスタムルーティングは、Railsアプリケーションにおいてエラー発生時に表示されるページのURLをカスタマイズする仕組みです。これにより、ユーザーにわかりやすいエラーページを提供することができます。

## エラーページのカスタムルーティングとは何か

エラーページのカスタムルーティングは、HTTPステータスコードに応じてカスタムエラーページを表示するための設定です。通常、Railsは特定のHTTPステータスコードに対応するエラーページを自動的に表示しますが、カスタムルーティングを使用すると、この挙動を変更できます。

## カスタムルーティングの設定例

以下は、エラーページのカスタムルーティングを設定する例です。

```ruby
# config/routes.rb

Rails.application.routes.draw do
  # 404 Not Foundエラーのカスタムルーティング
  get '/404', to: 'errors#not_found'

  # 500 Internal Server Errorエラーのカスタムルーティング
  get '/500', to: 'errors#internal_server_error'
end
```
この設定では、404 Not Foundエラーが発生した場合にはerrors#not_foundアクションを実行し、500 Internal Server Errorエラーが発生した場合にはerrors#internal_server_errorアクションを実行します。

カスタムルーティングを設定することで、特定のエラー状況に対して独自のエラーページを表示できます。これにより、ユーザーに対してエラーの詳細を提供し、使いやすいアプリケーションを構築できます。

# ルート情報の確認とトラブルシューティング {#ルート情報の確認とトラブルシューティング}

Railsアプリケーションにおいて、正しく設定されたルーティングは重要です。
ここでは、ルート情報を確認し、トラブルシューティングを行うための手順を紹介します。
(私がルートがうまく設定できずに躓いたので…)

## ルート情報の確認

うまくいかない時にはまず現状を確認しましょう。
ターミナルで以下のコマンドを実行すると、アプリケーション内の全てのルート一覧が表示されます。

```bash
rails routes
```
このコマンドは、設定されたルートとそれに対応するコントローラーアクションやHTTPメソッド、URLを表示します。ルート名やヘルパーメソッドも確認できます。

## トラブルシューティング手順
ルートに関する問題が発生した場合、以下の一般的なトラブルシューティング手法を試すことができます。

### 1. ルート名の確認

ルート名が正しく設定されていることを確認してください。名前付きルートやルートヘルパーを使用する場合、ルート名の誤りはエラーの原因となります。

### 2. コントローラーアクションの確認

コントローラーアクションが存在し、正しいアクション名が設定されていることを確認してください。ルートはコントローラーアクションと関連付けられており、アクション名の間違いはエラーを引き起こします。

### 3. ルートの順序

`config/routes.rb`ファイル内のルート設定は、上から下に評価されます。同じURLパターンが複数のルートにマッチする場合、最初にマッチしたルートが使用されます。ルートの順序が問題になることがあるため、確認して調整することが重要です。

### 4. ルートの更新

ルートを変更した場合、`rails routes`コマンドでルート情報を更新し、変更内容が反映されていることを確認しましょう。一部の変更はサーバー再起動が必要なことがあります。

上記の流れで確認すれば解決することができる…はずです。
ぜひ実践してみてください。

# まとめ
最後までお付き合いくださりありがとうございます！
ルーティングはアプリ開発で避けては通れない道です。少しでもお役に立てていればうれしいです。

私自身、苦戦したので勉強しアウトプットしてみました。
まだまだ勉強中なので、認識として間違っていることや説明不足で混乱を招く表現等ありましたらコメントでご指摘いただけると幸いです。


# 参考文献
- [Railsガイド](https://railsguides.jp/routing.html)