【Ruby on Rails】ルーティングで困ったroutes.rbについて振り返ってみる

こんにちは。あがさんです！！

見様見真似でRuby on Railsの学習をしています。
Railsガイドやチュートリアルが丁寧に教えてくれるので、分からない点があってもなんとなくアプリケーションが出来上がってしまいます。(凄い！けどなんとなくは良くない)

今回はRailsでアプリケーション開発をしていた際に、苦手意識を持っていたroutes.rbと
親の顔よりも見たlocalhost:3000/rails/info/routesのページについて触れていきます。

## ルーティング　とは
Ruby on Railsにおいて、アプリケーション内のURLをコントローラのアクションに結びつける仕組みのことです。config/routes.rbファイルで定義します。
下記は簡単なroutes.rbのファイルです。

```routes.rb
Rails.application.routes.draw do
  # CRUD routes without using resources
  get    'users',           to: 'users#index'
  get    'users/:id',      to: 'users#show'
end
```

```users_controller.rb
class UsersController < ApplicationController
  def index
    @users = User.all
  end
  def show
    @user = User.find(params[:id])
  end
end

```
↓ 下の図はRailsアプリ起動時にアクセスできるルーティングが確認出来るページです。エラーのとき赤くなって画面に飛び込んでくるのを何かも経験しました...。
見ていただきたいのは２段目、３段目の#indexアクションと#showアクションのルーティングです。
![スクリーンショット 2024-08-31 15.10.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775546/1e2f2982-c768-6c8d-682b-77ed29dede76.png)

**routes.rbで定義した通りにこのRoutesページにも記載されていますよね!**
自分はルーティングに迷った場合はこのページを見ながら問題箇所を直しています。

## デモページで確認
簡単なユーザー登録ページを作りました。ユーザー一覧とユーザー詳細の２ページがあります。
まず``get '特定のURL', to: 'コントローラー#アクション'``がルーティングの基本の型になります。
``get'users',to: 'users#index'``であれば、usersにアクセスするとusersのURLにGETリクエストが送信され、RailsはUsersControllerのindexアクションを実行します。

このデモページだと、localhost:3000の後に/usersをつけた``localhost:3000/users``にアクセスするとusers_controller.rbのindexアクションが発火して、下記の図のようにUserデータを全て取得してページに表示するように動作します。


![スクリーンショット 2024-08-31 15.07.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775546/0a69d7f6-dc09-99c1-bff2-26b5a70b3c61.png)

次のユーザー詳細へアクセスする際も同じ考え方となります。
``get 'users/:id', to: 'users#show'``となるので
localhost:3000/usersの後にそれぞれのid(図の場合はuser_id: 1)をつけた``localhost:3000/users/1``にアクセスするとusers_controller.rbのshowアクションが発火して、下記の図のようにuser_id: 1を持つユーザーの詳細ページへ遷移するように動作します。

![スクリーンショット 2024-08-31 15.28.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775546/258d56d0-7f8f-8319-279f-39081f0cdfc9.png)


## URLのパスを変更する
routes.rbではモデルやコントローラと同じ名称でURLを作ることが多いかと思います。
ただサービス内容やイメージに対して、URLのパスがあまりに素っ気ないということもあるかも知れません。
そんな時はroutes.rbのファイル内でURLのパスを変更できます。
``get 'users', to: 'users#index'``から``get 'chikawa', to: 'users#index'``へ
``get 'chikawa/:id', to: 'users#show'``から``get 'chikawa/:id', to: 'users#show'``へ
変更してみました。

```routes.rb
Rails.application.routes.draw do
  # Root path to index action
  root 'users#index'
  # CRUD routes without using resources
  get    'chikawa',          to: 'users#index',   as: 'home'
  get    'chikawa/:id',      to: 'users#show',    as: 'character'

end
```
"/users"の部分が"chikawa"変更されていることが確認できます。
![スクリーンショット 2024-08-31 14.32.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775546/db2d0a84-ba76-7976-1819-2465f82a5a20.png)
<br>
実際に``localhost:3000/chikawa``で動作することができました。
![スクリーンショット 2024-08-31 14.30.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775546/0bb066f0-4256-92de-d1be-48050a40c644.png)
<br>
``localhost:3000/chikawa/１``も同様ですね。
![スクリーンショット 2024-08-31 15.30.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775546/e45791d7-c4b3-d24d-93ca-b08b7e2e701c.png)


## root と 名前付きルートのすすめ
```routes.rb
Rails.application.routes.draw do
    root 'pages#index'

  get    'users',           to: 'users#index', as: "home"
  get    'users/:id',      to: 'users#show', as: "character"
end
```
**root** : いわゆるサービスのTOPページにしたいページ(アクション)を割り当て出来る機能です。``localhost:3000/``にアクセスするとデフォルトではRuby on Railsのロゴのページが表示されるように設定されています。<br>ここで上記のように``root 'pages#index'``と記述をすると``localhost:3000/``にアクセスするとindexアクションのページが表示されるようになります。<br>
またroot_pathというルーティングヘルパーが付与されてコードに組み込み安くなります。

![スクリーンショット 2024-08-31 14.32.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775546/db2d0a84-ba76-7976-1819-2465f82a5a20.png)

**名前付きルート** : root_path以外に自分独自で命名できるルーティングヘルパーを**名前付きルート**（Named Route）と呼びます。``get'users/:id', to: 'users#show'``　の後ろに``, as: "character"``と追記することで``users/:id``の代わりに``character``という表記でコードを書くことができます

```routes.rb
Rails.application.routes.draw do
    root 'pages#index'

  get    'users',           to: 'users#index', as: "home"
  get    'users/:id',      to: 'users#show', as: "character"
end
```
↓どちらも同じようにindexアクションのページ戻ることができます。
```show.html.erb
<%= link_to "Back to Top", root_path %>　# root_pathを使用してTopへ戻る

<%= link_to "Back to Top", home_path %>　# 名前付きルートを使用してTopへ戻る

```
注意）自由にルートパスをネーミングをしてしまうと共同開発をしている人たちに混乱を与えてしまうかも知れないので、ネームミングには分かりやすさと配慮を心がけましょう。

## 便利な resources
```routes.rb
Rails.application.routes.draw do
  # Root path to index action
  root 'users#index'

  resources :users
end
```
Railsには``resources :users``と書くだけでよしなにルーティングを組んでくれる機能があります。とても便利です。下のRotesの表ように一般的なCRUD処理にも対応できるようルーティングが割り振られています。

![スクリーンショット 2024-08-31 15.13.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3775546/9e46c34e-8d8b-3792-cecb-941c8ecb1e3a.png)

※注意点）「とりあえず``resources :users``と書いておけば良いんやろぉ!?」と済ませてしまう人は後でルーティングエラーに陥ります!!（はい。...何を隠そうこの私です‼️‼️）
``resources``を定義したらどんなルーティングになっているか自分自信で把握しながら、routes.rbを作成していくというのが正しい向き合い方だと痛感しました。

## まとめ
いかがでしたでしょうか。

Railsは設定より規約（convention over configuration）を重んじるフレームワークです。今までroutes.rbの定義が理解できておらず、ルーティングエラーに悩んでいました。今回振り返る機会がとれて大変よかったです。

routes.rbをしっかり定義することで、アプリ全体のルーティング管理が容易にできることがわかりました。
まだまだ奥深いルーティング定義ですが引き続き理解を深めていきたいと思います。

ここまで読んでいただきありがとうございました〜
次回もどうぞよろしくお願いします!!

*~Qiitaの歴史がまた1ページ~*

**参考文献**
[Ruby on Rails ガイド](https://railsguides.jp/)
[Ruby on Rails チュートリアル](https://railstutorial.jp/)