概要
Railsで開発しているとroutes.rbが複雑になってきます。
その際に、単純なrails routesコマンドだけだと、探しきれない!ってことになってきます。
その際に便利な方法を紹介していきます。
以下がこの記事で紹介する方法です。
-
http://localhost:3000/rails/info/routesで確認 -
rails routes+ オプション(-g,-c) -
rails routes+grep(orfind)
前提
ダミーで以下のroutes.rbを使います。
ECサイトの想定でChatGPTに作ってもらいました。
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を実行すると、以下のようになります。

ん~ちょっと嫌ですね。パッと目的のルートを確認したい。
http://localhost:3000/rails/info/routesで確認
一つ目の方法はブラウザで確認する方法です。
こちらの方法が一番直感的かなとおもいます。
この画面のPath Matchの部分に自分が確認したいパスを入力すると検索して表示してくれます。

また、この検索はRouting Errorが起きたときにもできます。
このルート違うから調べろってことですね。Railsさんは親切!

rails routes + オプション(-g, -c)
次の方法はコマンドに、オプションを追加して確認する方法です。
自分はこの方法を一番使います。
以下のようにgrepオプション(-g)を付けることで、Prefix、Verb、URI Patternのいずれかに一致するルートを絞り込むことが可能です。
$ rails routes -g reviews
$ rails routes -g PATCH
コントローラーで絞り込みしたい場合は、-cオプションを使うことができます。
$ rails routes -c products

-cの方では、reviewsコントローラーのルートが含まれていないことがわかります。
rails routes + grep (or find)
次に紹介するのはgrepコマンドを使う方法です。
grepコマンドとは、入力された値を絞り込んでくれるLinuxコマンドです。Windowsの場合はfindコマンドを使います。(後述)
以下のようにrails routesとgrepをパイプでつなげてあげると絞り込みが可能です。
$ rails routes | grep cart
grepの最大の利点は、検索条件を追加していけるところです。
$ rails routes | grep cart | grep GET | grep show

オプションを使っても出力が多い場合や複数検索したい場合はgrepを使うといいでしょう。
WindowsでコマンドプロンプトやPowerShellを使う場合はfindを使います
findの引数は"で囲む必要があります。
$ rails routes | find "cart"
※WSLを使っている場合は、Linuxコマンドが使えるのでgrepで問題ありません
オプションとgerpコマンドどちらを使うべきか
基本的にはオプションを使ったほうがいいです。
理由は2つあります。
-
インデントの見やすさ
以下の出力結果をご覧ください。

明らかにオプションでの出力の方が縦がそろっていて見やすいですよね。
この見にくさは、出力から文字列に一致する行だけを抜き出すというgrepの仕様によるものです。
実際、grepする前のrails routesによる出力は必要ないめちゃめちゃ長いルートも一緒に出力されています。
そして、そのめちゃめちゃ長いルートも含めて揃えてから出力されているため、grepで抜き出した後の出力はインデントが揃っていないような見た目になってしまいます。 -
何もマッチしなかったとき教えてくれる
存在しないルートを探してみましょう。

オプションの方が、見つからなかったよって返してくれます。しかし、grepの方は無言ですね。
上記の理由によって、基本的にはオプションを使い、VerbやURI Patternなども含めた複数検索がしたいときはgrepを使うという方針をお勧めします。
※ちなみに、オプションとgrepを同時に使うことも可能です。

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



