Rails RESTfulなルーティング

## 目次

[1. はじめに](#1-はじめに)
[2. Rails のルーティング設計](#2-rails-のルーティング設計)
[3. RESTful なルーティングとは](#3-restful-なルーティングとは)
[4. 参考](#4-参考)

## 1. はじめに

Rails で CRUD 処理を作成中、どの操作がどのルーティングなのかよく忘れてしまうため、備忘録としてまとめておくことにしました。  

また Rails のルーティングは REST 設計に基づいていますが、REST 設計についてあまり知りませんでした。 
 RESTful なルーティング設計は Rails をはじめ広く採用されているため、その考え方やメリットについても調べてみようと思いました。  

## 2. Rails のルーティング設計

まずは、Rails のルーティング設計がどうなっているかを見てみたいと思います。  
これは、Rails にルーティングを自動作成してもらうことで簡単に分かります。  

### ルーティングを自動作成

Rails では、ルーティング設定用のファイル `config/routes.rb` にルーティングを書いていきます。  
一つずつルーティングを書いていくことももちろんできますが、`resources` キーワードを使うと基本的なルーティングが自動的に作成されます。例えば以下のように `resources :comments` と書くだけで、コメントに関する CRUD 処理のルーティングを簡単に作ることができます。  

```rb
# config/routes.rb
Rails.application.routes.draw do
  resources :comments # この行を追加
end
```

ターミナルで以下のコマンドを打って、ルーティング一覧を確認してみましょう。  

```bash
rails routes
```

出力結果が以下です。  

```bash
Prefix        Verb   URI Pattern                       Controller#Action
.
.
.
comments      GET    /comments(.:format)               comments#index
              POST   /comments(.:format)               comments#create
new_comment   GET    /comments/new(.:format)           comments#new
edit_comment  GET    /comments/:id/edit(.:format)      comments#edit
comment       GET    /comments/:id(.:format)           comments#show
              PATCH  /comments/:id(.:format)           comments#update
              PUT    /comments/:id(.:format)           comments#update
              DELETE /comments/:id(.:format)           comments#destroy
.
.
.
```

ちなみにルーティングを一つずつ書く場合は、以下のようになります。自動生成したものと同じ設計です。  

```rb
# config/routes.rb
Rails.application.routes.draw do
  get "/comments", to: "comments#index"
  get "/comments/new", to: "comments#new"
  post "/comments", to: "comments#create"
  get "/comments/:id", to: "comments#show"
  get "/comments/:id/edit", to: "comments#edit"
  patch "/comments/:id", to: "comments#update"
  put "/comments/:id", to: "comments#update"
  delete "/comments/:id", to: "comments#destroy"
end
```

### ルーティングごとの用途

上記のルーティングを以下の表にまとめました。  
これが Rails で基本となるルーティングであり、REST 設計に基づいたものです。  
新規作成や編集など CRUD の各処理が、URI と HTTP メソッドの組み合わせによって割り当てられています。  

|HTTPメソッド|URI|アクション|用途|
|--|--|--|--|
|GET|/comments|index|コメントの一覧を表示|
|GET|/comments/new|new|コメントの新規作成フォームを表示|
|POST|/comments|create|コメントを新規作成|
|GET|/comments/:id|show|特定のコメントを表示|
|GET|/comments/:id/edit|edit|特定のコメントの編集フォームを表示|
|PATCH または PUT|/comments/:id|update|特定のコメントを編集|
|DELETE|/comments/:id|destroy|特定のコメントを削除|

## 3. RESTful なルーティングとは

では RESTful なルーティングとは何なのでしょうか？  

### そもそも REST とは

そもそも REST (Representational State Transfer) が何かというと、Webシステムにおける**設計の考え方**のことです。そしてその REST の考え方に基づいて作られたものを、RESTful なシステム、RESTful な ルーティング、といったように呼んだりします。  

REST で重要な考え方の一つが、**『リソース』を扱う**ということです。  
Webサービスを作成する上で、ユーザーや記事、コメント、商品など色々な情報が必要になりますよね。これらの情報のかたまりを REST では『リソース』としています。例えば『ユーザーリソース』『コメントリソース』のような感じです。  

( REST の定義はこれだけではなく、ステートレス性など他にも色々あるのですが...この記事では理解しやすいように、一部のみ取り上げました。)

### RESTful なルーティング

REST 設計の考え方では、リソースは一意の URI で識別されます。これが先ほど作成したルーティングの `comments` の部分です。  
ルーティング一覧で見たように、**リソースごとの URI に適切な HTTP メソッドを使うことで、『リソース』を操作**します。これが RESTful なルーティングの基本的な考え方です。  

REST 設計に基づくことで、一貫したルーティング構造を作ることができます。(慣れれば)直感的に構造を理解しやすく、リソースやルーティングの追加もしやすそうだなと思いました。このようなメリットがあるため、REST 設計は広く採用されているのだなということが分かりました。  

## 4. 参考

- [Rails のルーティング - Railsガイド](https://railsguides.jp/routing.html)
- [アーキテクチャスタイル「REST」とは何か - Think IT](https://thinkit.co.jp/free/article/0609/8/4)
- [Representational State Transfer - Wikipedia](https://ja.wikipedia.org/wiki/Representational_State_Transfer)