9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

GeekSalonAdvent Calendar 2023

Day 3
記事投稿キャンペーン 「Rails強化月間」

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

Last updated at Posted at 2023-11-07

概要

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
ん~ちょっと嫌ですね。パッと目的のルートを確認したい。

http://localhost:3000/rails/info/routesで確認

一つ目の方法はブラウザで確認する方法です。
こちらの方法が一番直感的かなとおもいます。

にアクセスすると以下のような画面になります。
image.png

この画面のPath Matchの部分に自分が確認したいパスを入力すると検索して表示してくれます。
image.png

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

rails routes + オプション(-g, -c)

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

$ rails routes -g reviews

image.png

$ rails routes -g PATCH

image.png

コントローラーで絞り込みしたい場合は、-cオプションを使うことができます。

$ rails routes -c products

image.png
-cの方では、reviewsコントローラーのルートが含まれていないことがわかります。

rails routes + grep (or find)

次に紹介するのはgrepコマンドを使う方法です。
grepコマンドとは、入力された値を絞り込んでくれるLinuxコマンドです。Windowsの場合はfindコマンドを使います。(後述)
以下のようにrails routesとgrepをパイプでつなげてあげると絞り込みが可能です。

$ rails routes | grep cart 

image.png

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

$ rails routes | grep cart | grep GET | grep show

image.png
オプションを使っても出力が多い場合や複数検索したい場合はgrepを使うといいでしょう。

WindowsでコマンドプロンプトやPowerShellを使う場合はfindを使います
findの引数は"で囲む必要があります。

$ rails routes | find "cart"

※WSLを使っている場合は、Linuxコマンドが使えるのでgrepで問題ありません

オプションとgerpコマンドどちらを使うべきか

基本的にはオプションを使ったほうがいいです。
理由は2つあります。

  1. インデントの見やすさ
    以下の出力結果をご覧ください。
    image.png
    明らかにオプションでの出力の方が縦がそろっていて見やすいですよね。
    この見にくさは、出力から文字列に一致する行だけを抜き出すというgrepの仕様によるものです。
    実際、grepする前のrails routesによる出力は必要ないめちゃめちゃ長いルートも一緒に出力されています。
    そして、そのめちゃめちゃ長いルートも含めて揃えてから出力されているため、grepで抜き出した後の出力はインデントが揃っていないような見た目になってしまいます。

  2. 何もマッチしなかったとき教えてくれる
    存在しないルートを探してみましょう。
    image.png
    オプションの方が、見つからなかったよって返してくれます。しかし、grepの方は無言ですね。

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

※ちなみに、オプションとgrepを同時に使うことも可能です。
image.png

まとめ

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

参考

9
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?