rails routes で特定のルートを簡単に絞り込む方法をまとめてみた

# 概要
Railsで開発していると`routes.rb`が複雑になってきます。
その際に、単純な`rails routes`コマンドだけだと、探しきれない！ってことになってきます。
その際に便利な方法を紹介していきます。

以下がこの記事で紹介する方法です。

- `http://localhost:3000/rails/info/routes`で確認
- `rails routes` + オプション(`-g`, `-c`)
- `rails routes` + `grep` (or `find`)

# 前提
ダミーで以下のroutes.rbを使います。
ECサイトの想定でChatGPTに作ってもらいました。
```routes.rb
Rails.application.routes.draw do
  # トップページ
  root 'products#index'

  # 商品に関するルート
  resources :products, only: [:index, :show] do
    resources :reviews, only: [:create, :destroy] # 商品のレビュー機能
  end

  # カート機能
  resource :cart, only: [:show] do
    put 'add/:product_id', on: :collection, to: 'carts#add', as: :add_to
    put 'remove/:product_id', on: :collection, to: 'carts#remove', as: :remove_from
    get 'checkout', on: :member
  end

  # 注文処理
  resources :orders, only: [:new, :create, :show]

  # ユーザーセッション（ログイン・ログアウト）
  resource :session, only: [:new, :create, :destroy]

  # ユーザー登録
  resources :users, only: [:new, :create, :edit, :update]

  # 管理者ページ
  namespace :admin do
    resources :products, except: [:show]
    resources :orders, only: [:index, :show, :update]
    # その他管理者用のルートが追加される場所
  end

  # 例外的なルーティング、たとえば静的ページなど
  get 'about', to: 'static_pages#about'
  get 'contact', to: 'static_pages#contact'

  # エラーページ
  match '/404', to: 'errors#not_found', via: :all
  match '/500', to: 'errors#internal_server_error', via: :all
end
```
この状態で、`rails routes`を実行すると、以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324819/64deeb46-685d-2456-f007-6a7867d84ed7.png)
ん~ちょっと嫌ですね。パッと目的のルートを確認したい。

# `http://localhost:3000/rails/info/routes`で確認
一つ目の方法はブラウザで確認する方法です。
こちらの方法が一番直感的かなとおもいます。

http://localhost:3000/rails/info/routes

にアクセスすると以下のような画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324819/20a3fc75-20fc-113d-cbc4-3ea9658a2187.png)

この画面の<b>Path Match</b>の部分に自分が確認したいパスを入力すると検索して表示してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324819/100b3f2d-8981-dd67-d1e8-70406dcfcf69.png)

また、この検索は`Routing Error`が起きたときにもできます。
このルート違うから調べろってことですね。Railsさんは親切！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324819/5bbf29fb-5051-5853-7d1f-525259d3fd90.png)

# `rails routes` + オプション(`-g`, `-c`)
次の方法はコマンドに、オプションを追加して確認する方法です。
自分はこの方法を一番使います。
以下のようにgrepオプション(`-g`)を付けることで、<b>Prefix、Verb、URI Patternのいずれかに一致</b>するルートを絞り込むことが可能です。
```bash
$ rails routes -g reviews
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324819/f7745f0d-9d79-bcb1-91e1-c7910b943c44.png)
```bash
$ rails routes -g PATCH
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324819/8c7c8727-cfef-4e29-a151-db34f7dd133c.png)


コントローラーで絞り込みしたい場合は、`-c`オプションを使うことができます。
```bash
$ rails routes -c products
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324819/5993a916-ecc7-1c15-d547-535f4e596747.png)
 `-c`の方では、reviewsコントローラーのルートが含まれていないことがわかります。
 
# `rails routes` + `grep` (or `find`)
次に紹介するのはgrepコマンドを使う方法です。
grepコマンドとは、入力された値を絞り込んでくれるLinuxコマンドです。Windowsの場合はfindコマンドを使います。(後述)
以下のようにrails routesとgrepをパイプでつなげてあげると絞り込みが可能です。

```bash
$ rails routes | grep cart 
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324819/4a042942-4d0f-3e71-80f0-d4be26cd79cc.png)

grepの最大の利点は、検索条件を追加していけるところです。

```bash
$ rails routes | grep cart | grep GET | grep show
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324819/0219b479-10de-589b-a877-da74e5ec3201.png)
オプションを使っても出力が多い場合や複数検索したい場合はgrepを使うといいでしょう。

WindowsでコマンドプロンプトやPowerShellを使う場合はfindを使います
findの引数は`"`で囲む必要があります。
```bash
$ rails routes | find "cart"
```
※WSLを使っている場合は、Linuxコマンドが使えるのでgrepで問題ありません

# オプションとgerpコマンドどちらを使うべきか
<b>基本的にはオプションを使ったほうがいいです。</b>
理由は2つあります。

 1. <b>インデントの見やすさ</b>
以下の出力結果をご覧ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324819/70255cb6-16f9-1606-b128-d8add33983b8.png)
明らかにオプションでの出力の方が縦がそろっていて見やすいですよね。
この見にくさは、出力から文字列に一致する行だけを抜き出すというgrepの仕様によるものです。
実際、grepする前の`rails routes`による出力は必要ないめちゃめちゃ長いルートも一緒に出力されています。
そして、そのめちゃめちゃ長いルートも含めて揃えてから出力されているため、grepで抜き出した後の出力はインデントが揃っていないような見た目になってしまいます。<br><br>

 2. <b>何もマッチしなかったとき教えてくれる</b>
存在しないルートを探してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324819/671873b6-89f4-3f7c-743e-341a503e8570.png)
オプションの方が、見つからなかったよって返してくれます。しかし、grepの方は無言ですね。

上記の理由によって、基本的にはオプションを使い、VerbやURI Patternなども含めた<b>複数検索がしたいときはgrepを使う</b>という方針をお勧めします。

※ちなみに、オプションとgrepを同時に使うことも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324819/dae5b0a4-d3f1-2128-a555-1e13c73d6889.png)


# まとめ
以上、`rails routes`の絞り込み方法でした！よきRailsライフを！

# 参考

https://railsguides.jp/routing.html#%E6%97%A2%E5%AD%98%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%AB%E3%82%92%E4%B8%80%E8%A6%A7%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B