rails routes の見方|出力の読み方・フィルタオプション・URLヘルパーを徹底解説

rails routes の見方|出力の読み方・フィルタオプション・URLヘルパーを徹底解説

Rails 開発で「どのURLがどのコントローラに繋がっているか」を確認するための必須コマンド:

bin/rails routes

新しい開発者が参画した時、既存ルートの全体像を把握したい時、No route matches エラーの原因を調査したい時、必ず使うコマンドです。

しかし、bin/rails routes の出力は大規模アプリでは数百行にもなり:

  • どの列が何を意味するのか分からない
  • 必要なルートだけ絞り込めない
  • mounted エンジン(Devise, Sidekiq)のルートが大量混入
  • --expanded-g などの便利オプションを知らない
  • URL helper の正しい使い方が分からない
  • 「ルートはあるはずなのに動かない」が解決できない

など、効率的な使い方を知らないと損する場面が多くあります。

本記事では、rails routes の見方を、出力の読み方から実践的な活用法まで完全網羅します。Prefix/Verb/URI Pattern/Controller#Action の理解、-g/-c/-E/-u の各オプション、URL helper活用、namespace/scope確認、mounted Engine の扱い、ブラウザ表示、ルーティング設計のチェック、トラブルシューティング、FAQまで完全網羅。この1本でRails のルーティングを自信を持って管理できるようになります。


目次

結論:今すぐ使える基本パターン10選

時間がない方向けに、頻出パターンを先に示します。

# ① 全ルート表示
bin/rails routes

# ② キーワード検索(grep)
bin/rails routes -g users

# ③ 特定コントローラ
bin/rails routes -c users
bin/rails routes -c Admin::UsersController

# ④ HTTPメソッド絞り込み
bin/rails routes -g POST

# ⑤ 詳細表示(垂直)
bin/rails routes -E
bin/rails routes --expanded

# ⑥ 未使用ルート検出
bin/rails routes -u

# ⑦ URLパスで検索
bin/rails routes -g /users/1

# ⑧ ヘルプ表示
bin/rails routes --help

# ⑨ ブラウザで確認(開発環境)
# http://localhost:3000/rails/info/routes
# ⑩ console で確認(前出 rails console 使い方記事の app オブジェクト)
app.users_path        # => "/users"

詳細は以下で順に解説します。


まず押さえる:基本コマンドと出力

基本実行

bin/rails routes

出力例:

                                    Prefix Verb   URI Pattern                       Controller#Action
                                      root GET    /                                 home#index
                                     users GET    /users(.:format)                  users#index
                                           POST   /users(.:format)                  users#create
                                  new_user GET    /users/new(.:format)              users#new
                                 edit_user GET    /users/:id/edit(.:format)         users#edit
                                      user GET    /users/:id(.:format)              users#show
                                           PATCH  /users/:id(.:format)              users#update
                                           PUT    /users/:id(.:format)              users#update
                                           DELETE /users/:id(.:format)              users#destroy
                            api_v1_users   GET    /api/v1/users(.:format)           api/v1/users#index
                                           POST   /api/v1/users(.:format)           api/v1/users#create

4つの列の意味

意味
PrefixURL helper の prefix({prefix}_path等)user, new_user
VerbHTTPメソッドGET, POST, PATCH, PUT, DELETE
URI PatternURL パターン/users/:id(.:format)
Controller#Action処理するコントローラ#アクションusers#show

URI Pattern の記号

/users/:id(.:format)
        ↑    ↑
   動的パラメータ  オプショナル
  • :id: URL パラメータ(コントローラで params[:id] で取得)
  • (.:format): 拡張子(任意)。.json, .xml

例:

  • /users/1params[:id] = "1"
  • /users/1.jsonparams[:id] = "1", params[:format] = "json"

URL helper の使い方

Prefix から helper メソッドを導出

Prefix: user
URI:    /users/:id

→ URL helper:
   user_path(@user)   # => "/users/1"
   user_url(@user)    # => "http://example.com/users/1"
Prefix の suffix戻り値
_path相対パス(ホスト・スキーマなし)
_url完全URL(http://example.com 含む)

View で使う

<%= link_to "Edit", edit_user_path(@user) %>
<%= form_with model: @user, url: user_path(@user) %>

controller で使う

class UsersController < ApplicationController
  def create
    @user = User.create(user_params)
    redirect_to user_path(@user)
    # または
    redirect_to @user   # 自動でuser_pathが呼ばれる
  end
end

console で確認

# bin/rails c
app.user_path(1)   # => "/users/1"
app.users_path     # => "/users"
app.edit_user_path(1)   # => "/users/1/edit"

詳細はrails console 使い方の記事も参照。

パラメータ付き

user_path(@user, format: :json)
# => "/users/1.json"

user_path(@user, sort: "name", page: 2)
# => "/users/1?sort=name&page=2"

# 名前付きパラメータ
search_path(q: "Rails")
# => "/search?q=Rails"

resources の理解

# config/routes.rb
resources :users

これで7つのルートが一度に定義されます:

            Prefix Verb   URI Pattern              Controller#Action
             users GET    /users(.:format)         users#index
                   POST   /users(.:format)         users#create
          new_user GET    /users/new(.:format)     users#new
         edit_user GET    /users/:id/edit(.:format) users#edit
              user GET    /users/:id(.:format)     users#show
                   PATCH  /users/:id(.:format)     users#update
                   PUT    /users/:id(.:format)     users#update
                   DELETE /users/:id(.:format)     users#destroy

CRUD と HTTPメソッドの対応

アクションHTTPメソッドURLパスhelper
indexGET/usersusers_path
showGET/users/:iduser_path(@user)
newGET/users/newnew_user_path
createPOST/usersusers_path
editGET/users/:id/editedit_user_path(@user)
updatePATCH/PUT/users/:iduser_path(@user)
destroyDELETE/users/:iduser_path(@user)

only / except で制限

# index と show のみ
resources :users, only: [:index, :show]

# destroy 以外
resources :users, except: [:destroy]

resource(単数)

resource :profile

→ 6つのルート(index がない):

   Prefix Verb   URI Pattern              Controller#Action
      profile GET    /profile/new(.:format)  profiles#new
              POST   /profile(.:format)      profiles#create
   edit_profile GET  /profile/edit(.:format) profiles#edit
      profile GET    /profile(.:format)      profiles#show
              PATCH  /profile(.:format)      profiles#update
              PUT    /profile(.:format)      profiles#update
              DELETE /profile(.:format)      profiles#destroy

ログインユーザーの「自分のプロフィール」のように、IDなしで1つのリソースを扱う時に使う。

ネストしたresources

resources :users do
  resources :posts
end

              user_posts GET    /users/:user_id/posts(.:format)         posts#index
                         POST   /users/:user_id/posts(.:format)         posts#create
           new_user_post GET    /users/:user_id/posts/new(.:format)     posts#new
          edit_user_post GET    /users/:user_id/posts/:id/edit(.:format) posts#edit
               user_post GET    /users/:user_id/posts/:id(.:format)     posts#show
                         PATCH  /users/:user_id/posts/:id(.:format)     posts#update
                         PUT    /users/:user_id/posts/:id(.:format)     posts#update
                         DELETE /users/:user_id/posts/:id(.:format)     posts#destroy

helper の使い方:

user_posts_path(@user)       # => "/users/1/posts"
user_post_path(@user, @post)  # => "/users/1/posts/2"

member / collection

resources :users do
  member do
    get :profile      # /users/:id/profile(特定のuser)
    post :follow
  end
  
  collection do
    get :search       # /users/search(全users対象)
    get :recent
  end
end
   profile_user GET    /users/:id/profile(.:format)  users#profile
    follow_user POST   /users/:id/follow(.:format)   users#follow
   search_users GET    /users/search(.:format)       users#search
   recent_users GET    /users/recent(.:format)       users#recent

namespace / scope の見方

namespace

namespace :admin do
  resources :users
end

       admin_users GET    /admin/users(.:format)        admin/users#index
                   POST   /admin/users(.:format)        admin/users#create
    new_admin_user GET    /admin/users/new(.:format)    admin/users#new
   edit_admin_user GET    /admin/users/:id/edit(.:format) admin/users#edit
        admin_user GET    /admin/users/:id(.:format)    admin/users#show
                   ...
  • パス: /admin/users
  • コントローラ: Admin::UsersControllerapp/controllers/admin/users_controller.rb
  • helper: admin_users_path

scope(モジュール分離なし、URLだけ変更)

scope "/admin" do
  resources :users
end

       users GET    /admin/users(.:format)    users#index
             POST   /admin/users(.:format)    users#create
   ...
  • パス: /admin/users
  • コントローラ: UsersController(通常)
  • helper: users_path

scope module(URLは普通、コントローラだけ別名前空間)

scope module: :admin do
  resources :users
end

→ パスは /users だが、コントローラは Admin::UsersController

API バージョン管理

namespace :api do
  namespace :v1 do
    resources :users
  end
  
  namespace :v2 do
    resources :users
  end
end

   api_v1_users  GET    /api/v1/users(.:format)   api/v1/users#index
   api_v2_users  GET    /api/v2/users(.:format)   api/v2/users#index

フィルタオプション

ルート数が多い大規模アプリで必須。

-g(grep)

最頻出のフィルタ。Prefix、URI、Controller#Action のすべてに対して部分一致:

# helper名で検索
bin/rails routes -g new_comment

# HTTPメソッドで検索
bin/rails routes -g POST

# URLパスで検索
bin/rails routes -g admin

# 特定パスでの解決確認(Rails 7.0+)
bin/rails routes -g /users/1
# 該当する全ルート(GET/PATCH/PUT/DELETE)を表示

-c(controller)

特定コントローラのルートのみ:

bin/rails routes -c users
bin/rails routes -c admin/users
bin/rails routes -c Admin::UsersController

-E(expanded、詳細表示)

垂直方向で1ルートずつ詳細表示:

bin/rails routes -E
# または
bin/rails routes --expanded

出力例:

--[ Route 1 ]----------------------------------------------------
Prefix            | users
Verb              | GET
URI               | /users(.:format)
Controller#Action | users#index
--[ Route 2 ]----------------------------------------------------
Prefix            | 
Verb              | POST
URI               | /users(.:format)
Controller#Action | users#create
--[ Route 3 ]----------------------------------------------------
Prefix            | new_user
Verb              | GET
URI               | /users/new(.:format)
Controller#Action | users#new

長いプレフィックスやコントローラ名で横にはみ出して読みにくい場合に便利。

-u(unused、未使用ルート)

定義されているがどこからも参照されていないルート:

bin/rails routes -u

開発中に作って使わなくなったルートを発見できます。

組み合わせ

# Admin の POST だけ
bin/rails routes -c admin -g POST

# expanded + 検索
bin/rails routes -g api -E

mounted Engine の確認

Devise、Sidekiq、Mission Control など、外部 Engine が mount されているルート。

config/routes.rb

# Devise(認証)
devise_for :users

# Sidekiq Web UI
mount Sidekiq::Web => "/sidekiq"

# Mission Control(Solid Queue)
mount MissionControl::Jobs::Engine, at: "/jobs"

rails routes での表示

                  new_user_session GET    /users/sign_in(.:format)        devise/sessions#new
                      user_session POST   /users/sign_in(.:format)        devise/sessions#create
              destroy_user_session DELETE /users/sign_out(.:format)       devise/sessions#destroy
                 new_user_password GET    /users/password/new(.:format)   devise/passwords#new
                          sidekiq         /sidekiq                        Sidekiq::Web
                              jobs        /jobs                           MissionControl::Jobs::Engine

Engine 内の詳細ルートは表示されないことが多い。

Engine 内のルートを確認

# Sidekiq engine の内部routes
bin/rails routes -g sidekiq -E

# devise 関連のみ
bin/rails routes -c devise

ブラウザで確認(開発環境)

ターミナルでなくブラウザで見やすく:

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

メリット

  • 検索ボックスで絞り込み(部分一致)
  • 表形式で見やすい
  • リンクで該当コントローラへジャンプ可能(一部)

デメリット

  • 開発環境のみ
  • 巨大なルート定義だと表示が重い

404 ページから

開発環境で RoutingError が出た時、エラー画面下部に全ルート一覧が表示されます。No route matches 時のヒントとして有用。

詳細はActionController::RoutingError の記事参照。


出力例:実際のケース

ケース1:典型的なRails 8 アプリ

bin/rails routes
                                    Prefix Verb   URI Pattern                          Controller#Action
                                      root GET    /                                    home#index

# 認証(Rails 8 authentication generator)
                                   session DELETE /session(.:format)                   sessions#destroy
                               new_session GET    /session/new(.:format)               sessions#new
                                           POST   /session(.:format)                   sessions#create
                                 passwords POST   /passwords(.:format)                 passwords#create
                              new_password GET    /passwords/new(.:format)             passwords#new
                             edit_password GET    /passwords/:token/edit(.:format)     passwords#edit
                                  password PATCH  /passwords/:token(.:format)          passwords#update
                                           PUT    /passwords/:token(.:format)          passwords#update

# 通常リソース
                                     users GET    /users(.:format)                     users#index
                                           POST   /users(.:format)                     users#create
                                  new_user GET    /users/new(.:format)                 users#new
                                 edit_user GET    /users/:id/edit(.:format)            users#edit
                                      user GET    /users/:id(.:format)                 users#show
                                           PATCH  /users/:id(.:format)                 users#update
                                           PUT    /users/:id(.:format)                 users#update
                                           DELETE /users/:id(.:format)                 users#destroy

# Solid Queue management(Mission Control)
                                      jobs        /jobs                                MissionControl::Jobs::Engine

ケース2:API モード

bin/rails routes
   Prefix Verb   URI Pattern                  Controller#Action
   api_v1_users   GET    /api/v1/users(.:format)        api/v1/users#index
                  POST   /api/v1/users(.:format)        api/v1/users#create
   api_v1_user    GET    /api/v1/users/:id(.:format)    api/v1/users#show
                  PATCH  /api/v1/users/:id(.:format)    api/v1/users#update
                  PUT    /api/v1/users/:id(.:format)    api/v1/users#update
                  DELETE /api/v1/users/:id(.:format)    api/v1/users#destroy

API 専用なので、new / edit アクションのルートが無いことが特徴。


constraints と format の見方

format 制約

get "/api/users", to: "api/users#index", defaults: { format: :json }
get "/users/:id", to: "users#show", format: :html

constraints による制約

constraints subdomain: "api" do
  resources :users
end

constraints id: /\d+/ do
  resources :posts
end

これらは rails routes で詳細は表示されないため、 config/routes.rb を直接確認が必要。

-E でconstraints も表示

bin/rails routes -E

一部のconstraints は expanded 表示で確認できることもあります。


routes.rb を分割

巨大なroutes.rb を分割(Rails 6+):

# config/routes.rb
Rails.application.routes.draw do
  draw(:api)       # config/routes/api.rb
  draw(:admin)     # config/routes/admin.rb
  
  root "home#index"
end
# config/routes/api.rb
namespace :api do
  namespace :v1 do
    resources :users
  end
end
# config/routes/admin.rb
namespace :admin do
  resources :users
  resources :posts
end

bin/rails routes では分割関係なくすべて表示。


URL helper の応用

キーワード引数

# /users/:id/posts/:post_id
nested_post_path(user_id: 1, post_id: 2)
# => "/users/1/posts/2"

# オブジェクトを渡す
user_post_path(@user, @post)
# => "/users/1/posts/2"

配列での渡し方

url_for([@user, @post])
# => "/users/1/posts/2"

polymorphic_path([@user, @post])
# 同上

form_with との連携

<%= form_with model: [@user, @post] do |f| %>
  <%# 自動的に user_post_path に POST/PATCH 送信 %>
<% end %>

redirect_to との連携

# モデルオブジェクト → show のURLにredirect
redirect_to @user
# → user_path(@user) と同等

# 配列 → ネストしたルート
redirect_to [@user, @post]

ありがちなトラブル

トラブル1:No route matches

詳細はActionController::RoutingError の記事。確認手順:

# 該当URLをgrep
bin/rails routes -g /users/123

# HTTPメソッドも確認
bin/rails routes -g POST

トラブル2:missing required keys

No route matches {:action=>"show", :controller=>"users"}, missing required keys: [:id]

user_path に id が渡されていない。

<%# ❌ %>
<%= link_to "Edit", user_path %>

<%# ✅ %>
<%= link_to "Edit", user_path(@user) %>

トラブル3:helper が存在しない(NoMethodError)

useres_path
# NoMethodError: undefined method 'useres_path'

ルート名の typo。bin/rails routes -g users で正しい helper 名確認。

詳細はundefined method nil:NilClass の記事参照。

トラブル4:HTTPメソッド違い

No route matches [POST] "/users/1"

POSTで送るのは /users/1 ではなく /users

bin/rails routes -g users
# POST /users     users#create   ← 確認
# PATCH /users/:id users#update

更新なら PATCH を使う:

<%= form_with model: @user, method: :patch do %>

トラブル5:CSRF token不足でPOSTがGET扱い

No route matches [GET] "/users/1"

GET でアクセスしようとしているが対応するルートが無い(destroy ルートはDELETE)。

<%# ❌ %>
<%= link_to "削除", user_path(@user) %>

<%# ✅ Turbo 経由 %>
<%= link_to "削除", user_path(@user), data: { turbo_method: :delete } %>

<%# または button_to %>
<%= button_to "削除", user_path(@user), method: :delete %>

トラブル6:namespace と scope の混同

# namespace = URL + controller両方変更
namespace :admin do
  resources :users   # /admin/users → Admin::UsersController
end

# scope = URL のみ変更
scope "/admin" do
  resources :users   # /admin/users → UsersController
end

意図と違う動作の場合、rails routes -c admin で確認。

トラブル7:mounted Engine が動かない

mount Sidekiq::Web => "/sidekiq"
# /sidekiq にアクセスして 404
  • gem インストール忘れ
  • 認証ミドルウェア通過漏れ
  • routes.rb の順序
bin/rails routes -g sidekiq
# routes 自体が登録されているか確認

ベストプラクティス

1. リソースフルなルーティング

CRUDが綺麗にハマるなら resources を活用:

# ✅ 推奨
resources :users

# ❌ 同等の冗長な書き方
get '/users', to: 'users#index'
post '/users', to: 'users#create'
get '/users/new', to: 'users#new'
# ...

2. namespace で API バージョン

namespace :api do
  namespace :v1 do
    resources :users
  end
end

3. concerns でルート共通化

concern :commentable do
  resources :comments
end

resources :articles, concerns: :commentable
resources :photos, concerns: :commentable

4. constraints で動的制約

constraints id: /\d+/ do
  resources :users
end

5. only / except で必要なアクションだけ

# 7アクション全部不要な場合
resources :users, only: [:index, :show]

# 削除だけ別途
resources :users, except: [:destroy]
delete 'users/:id/soft_delete', to: 'users#soft_delete', as: :soft_delete_user

6. 名前空間は早めに整理

# 規模が大きくなる前に
namespace :api do
  namespace :v1 do
    # ...
  end
end

後から構造変更すると URL helper が変わり、全箇所修正が必要。

7. ルート設計のドキュメント化

# config/routes.rb の冒頭に
#
# Public routes:
#   GET  /         => home
#   GET  /about    => static
#
# User routes:
#   GET  /signup
#   POST /signin
#
# API:
#   GET  /api/v1/users
#

よくある質問(FAQ)

Q1. rake routesrails routes どちらを使う?

Rails 6.1+ では bin/rails routes が標準。rake routes は非推奨。

Q2. ルート数が膨大で確認しにくい

# grep で絞り込み
bin/rails routes -g users

# またはブラウザで
http://localhost:3000/rails/info/routes

Q3. constraints を含めて表示したい

-E で表示が試みられますが、すべての制約は出ません。config/routes.rb を直接確認するのが確実。

Q4. resources のアクションを部分制限

resources :users, only: [:index, :show]
# index, show のみ生成

resources :users, except: [:destroy]
# destroy 以外

Q5. ルート名(prefix)をカスタマイズ

# as: で名前変更
get "/profile", to: "users#show", as: :my_profile
# → my_profile_path

resources :users, as: :members
# → members_path, member_path 等

Q6. config/routes.rb のリロード

通常は開発環境で自動リロード。手動で:

# rails console で
Rails.application.reload_routes!

Q7. ルート定義の順序は重要?

重要。先に書かれたルートが優先:

# ❌ 順序が悪い
get "*path", to: "errors#not_found"   # catch-all
resources :users                       # ← 到達しない

# ✅
resources :users
get "*path", to: "errors#not_found"   # 最後に

Q8. ルートからコントローラ#アクションを特定

# URL からの逆引き
bin/rails routes -g /users/1

# または ブラウザで /rails/info/routes 検索

Q9. テストでルートを確認

# RSpec
describe "routing" do
  it "routes /users to users#index" do
    expect(get: "/users").to route_to("users#index")
  end
end

rspec-rails の routing matcher 利用。

Q10. URL helper を一括 dump

# config/routes.rb の名前
Rails.application.routes.named_routes.routes.each do |name, route|
  puts "#{name}_path"
end

Q11. ルートをJSON形式で出力

公式オプションでJSON出力はないが、自前で:

require "json"
routes = Rails.application.routes.routes.map do |route|
  {
    name: route.name,
    verb: route.verb,
    path: route.path.spec.to_s,
    controller: route.defaults[:controller],
    action: route.defaults[:action]
  }
end
puts JSON.pretty_generate(routes)

Q12. リアルタイムでrouteを変更

開発時には自動で再読み込みされますが、テスト等で動的に変更したい:

Rails.application.routes.draw do
  get "/dynamic", to: "tests#dynamic"
end

通常は config/routes.rb で静的に。動的ルートは特殊用途のみ。


参考リンク・関連資料

Rails 公式

関連 Gem

関連記事(本サイト)


まとめ

rails routes は Rails 開発の必須コマンド。要点を再整理します。

  • 4つの列: Prefix(helper名の元)、Verb(HTTPメソッド)、URI Pattern、Controller#Action
  • URL helper: Prefix から _path / _url を組み合わせて使う
  • resources: 7つのRESTfulルートを一括定義(only/except で制限可)
  • resource(単数): IDなしの単一リソース用、6つのルート
  • namespace vs scope: namespace = URL + controller、scope = URL のみ
  • フィルタオプション:
    • -g でPrefix/URI/Action のキーワード検索
    • -c でコントローラ絞り込み
    • -E で詳細表示(垂直)
    • -u で未使用検出
  • ブラウザ確認: /rails/info/routes
  • mounted Engine: Devise/Sidekiq/Mission Control 等
  • ありがちトラブル: HTTPメソッド違い、CSRF、helper のid漏れ
  • ベストプラクティス: リソースフル、namespace でAPI管理、constraints活用

これらの知識は、Rails アプリの開発・デバッグ・コードレビュー・新規参画時のキャッチアップなど、あらゆる場面で活用できます。本記事をブックマークしておけば、ルーティング関連の作業を効率的に進められるようになります。


本記事は2026年6月時点の情報をもとに、Ruby on Rails 7.x / 8.x での動作確認・公式ドキュメントに基づき作成しています。Rails のバージョンによって挙動が異なる場合があるため、最新の情報はRails公式ガイドもあわせてご確認ください。